复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看。
手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的GUI篇
一个内容解析篇。
代码里有很详细的注释 所以直接放代码了 有不会的站内信或者评论我会及时回复。
MainActivity XML :只有一个ListView布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="asynctask.zb.com.asynctask_02.MainActivity"> <ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview" />
</RelativeLayout>
adapter_item .XML 图片暂用系统默认 明天发图片异步加载和优化的文再讲
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="0dp">
<ImageView
android:id="@+id/tvimage"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@mipmap/ic_launcher" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="0dp"> <TextView
android:layout_width="283dp"
android:layout_height="wrap_content"
android:singleLine="true"
android:id="@+id/tvtitle"
android:text="这是标题"
android:paddingLeft="5dp"
android:textSize="20sp"/> <TextView
android:layout_width="262dp"
android:layout_height="wrap_content"
android:maxLines="3"
android:id="@+id/tvcontent"
android:text="这是内容"
android:paddingTop="2dp"
android:paddingLeft="5dp"
android:textSize="12dp"
/>
</LinearLayout>
</LinearLayout>
===========================================
MainActivity:
1 。
获取到jsonString Log.d(TAG, jsonString);打印下是否可以获取到JSON数据
2.在
return nesBeanList;
处设置断点查看下返回的List<NewsBean>
package asynctask.zb.com.asynctask_02; import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity {
//初始化
String TAG = "zbace";//日志TAG
private ListView listView;
private String URL =" http://www.imooc.com/api/teacher?type=4&num=30";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
new NewsAsyncTask().execute(URL);
}
/** Ace in 2016/1/20
* 创建getJsonData(传入URL地址), 把从流中读取的JSON数据封装进NewsBean中放入List集合
* 1 调用readString方法获取到jason格式的字符串, openStream与url.openConnection().geTinpuStream() 一样;
* 获取到jsonString Log.d(TAG, jsonString);打印下是否可以获取到JSON数据
* 2 然后创建JSONObject对象,传入jsonString。
* 3 getJSONArray("data")方法 从中取出JSONArray,
* 在创建个for循环遍历JSONArray并取出newsicon,title,content,等信息
* 最后把信息放入NewsBean,再添加进数组
*
*/ private List<NewsBean> getJsonData(String url){
List<NewsBean> nesBeanList = new ArrayList<>(); try {
String jsonString = readStream(new URL(url).openStream());
Log.d(TAG, jsonString);
JSONObject jsonObject;
NewsBean newsBean;
try { jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for (int i = 0 ; i <jsonArray.length(); i++ ){
//每个JSONArray 的元素都是一个JSONObject
jsonObject = jsonArray.getJSONObject(i);
//把得到的jsonObject, 放入NewsBean
newsBean = new NewsBean();
newsBean.newsIconUrl = jsonObject.getString("picSmall");
newsBean.newsTitle = jsonObject.getString("name");
newsBean.newsContent = jsonObject.getString("description");
nesBeanList.add(newsBean);
} } catch (JSONException e) {
e.printStackTrace();
} } catch (IOException e) {
e.printStackTrace();
} return nesBeanList; //记得返回list
} /** Ace in 2016/1/20
* readStream方法是为了读取流中的数据从而获得流里的JSONString
*
* */ private String readStream(InputStream is){
InputStreamReader isr;
String result = "";
try {
String line = "";
//用把字节流转换为字符流(不转字符流无法显示中文),并设置编码为UTF-8;
isr = new InputStreamReader(is,"utf-8");
//套上缓冲流
BufferedReader br = new BufferedReader(isr);
//创建一个while循环
while ((line=br.readLine()) != null ){
result += line;//这就得到了我们需要的JSON字符串,从JSON字符串中就可以得到我们想要数据
} } catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return result;
}
/** Ace in 2016/1/20
* 异步获取JSON数据
*
* */ class NewsAsyncTask extends AsyncTask<String,Void,List<NewsBean>>{
@Override
protected List<NewsBean> doInBackground(String... params) {
return getJsonData(params[0]);//params就是我们传进来的String URL 网址 只传进来了一个 就输入[0]
} @Override
protected void onPostExecute(List<NewsBean>nesBeanList) {
super.onPostExecute(nesBeanList);
NewsAdapter newsAdapter = new NewsAdapter(MainActivity.this ,nesBeanList);
listView.setAdapter(newsAdapter); }
} }
================
NewsAdapter ViewHolder
package asynctask.zb.com.asynctask_02; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import java.util.List; /**
* Created by Ace on 2016/1/20.
*/
public class NewsAdapter extends BaseAdapter {
private List<NewsBean> mlist;
private LayoutInflater mInflater; public NewsAdapter(Context context,List<NewsBean>data){
//映射下 把data传给mlist
mlist = data;
//从一个Context中,获得一个布局填充器,这样你就可以使用这个填充器的inflater.inflate()来把xml布局文件转为View对象了,然后利用view对象,findViewById就可以找到布局中的组件
mInflater = LayoutInflater.from(context);
}
@Override
public Object getItem(int position) {
return mlist.get(position);
} @Override
public int getCount() { return mlist.size();
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder= null;
if (convertView == null){
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.adapter_item,null);
viewHolder.iconimage = (ImageView)convertView.findViewById(R.id.tvimage);
viewHolder.title = (TextView)convertView.findViewById(R.id.tvtitle);
viewHolder.content = (TextView)convertView.findViewById(R.id.tvcontent);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder)convertView.getTag();
viewHolder.iconimage.setImageResource(R.mipmap.ic_launcher);
viewHolder.title.setText(mlist.get(position).newsTitle);
viewHolder.content.setText(mlist.get(position).newsContent);
}
return convertView;
} class ViewHolder{
public TextView title;
public ImageView iconimage;
public TextView content; }
}
NewsBean 封装类
package asynctask.zb.com.asynctask_02; /**
* Created by Administrator on 2016/1/20.
*/
public class NewsBean {
public String newsIconUrl;
public String newsTitle;
public String newsContent;
}
先就这样回来补上效果图
Ace教你一步一步做Android新闻客户端(一)的更多相关文章
-
Ace教你一步一步做Android新闻客户端(四) 优化Bitmap大法
我计划着把需要用到的知识分解开来写,趁着我们要开发这款客户端的机会把安卓所有移动客户端开发中的技术贯穿其中,也是我自己成长的过程.By Ace in 20160121 我们开发一款新闻客户端程序,它的 ...
-
Ace教你一步一步做Android新闻客户端(五) 优化Listview
今天写存货了 调试一些动画参数花了些时间 ,嘿嘿存货不多了就没法做教程了,今天来教大家优化listview,等下我把代码编辑下 这次代码有些多 所以我把条理给大家理清楚.思路就是把加载图片的权利交给O ...
-
Ace教你一步一步做Android新闻客户端(三) JSON数据解析
对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,现在给大家讲解一下json这个知识点, 1 如何通过json-lib和gson这两个json解析库来对解析我们的j ...
-
阿冰教你一步一步做Android新闻客户端(二)两种异步线程加载图片的方法
哈哈哈抱着没人看的心态随便写,直接上代码,各位看官看注释 一种Thread 一种AsyncTask 先不说用框架 public class ImageLoader { private ImageVi ...
-
用TableView做的新闻客户端展示页面
用TableView做的新闻客户端展示页面 // MyTableViewImageCell.m // SildToDo // // Created by WildCat on 13-8-18. ...
-
IOS学习之路十四(用TableView做的新闻客户端展示页面)
最近做的也个项目,要做一个IOS的新闻展示view(有图有文字,不用UIwebview,因为数据是用webservice解析的到的json数据),自己一直没有头绪,可后来听一个学长说可以用listvi ...
-
一步一步教你如何在linux下配置apache+tomcat(转)
一步一步教你如何在linux下配置apache+tomcat 一.安装前准备. 1. 所有组件都安装到/usr/local/e789目录下 2. 解压缩命令:tar —vxzf 文件名(. ...
-
一步一步教你使用Git
一步一步教你使用Git 互联网给我们带来方便的同时,也时常让我们感到困惑.随便搜搜就出一大堆结果,然而总是有大量的重复和错误.小妖发出的内容,都是自己实测过的,有问题请留言. 现在,你已经安装了Git ...
-
一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...
随机推荐
-
【FFmpeg】Windows下64位ffmpeg编译
本文主要记录在64位Windows 7下,编译64位ffmpeg的过程. 1.资源准备 (1). MSYS http://sourceforge.net/projects/mingwbuilds/fi ...
-
Android菜鸟成长记2-内部类
Java内部类 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. 内部类可以是静态static的,也可用public,default,protected和private修 ...
-
Delphi调试DLL 不能调试 不能进入调试 注意!!!
如何调试DLL,在这里就不再赘述了,但是,今天就碰到了一个特别奇怪的问题,参数设置正确,就是不能调试?? 通过上网查资料,发现了问题,注意: 1, 将Project主菜单的Project Option ...
-
ZOC7 for Mac连接CentOS7无法输入中文问题
确定是ZOC7的问题 改为 iTerm2 加 ZSH 能够输入中文了 自己配置profile 慢慢所有的终端都用iTerm2 渐渐放弃ZOC7
-
论文笔记之:Learning Cross-Modal Deep Representations for Robust Pedestrian Detection
Learning Cross-Modal Deep Representations for Robust Pedestrian Detection 2017-04-11 19:40:22 Moti ...
-
linux processes
So that Linux can manage the processes in the system, each process is represented by a task_struct ...
-
ubuntu python opencv3 cv2.cv2 has no attribute &#39;face&#39; &#39;cv2.face&#39; has no attribute &#39;createEigenFaceRecognizer&#39;
学习opencv过程中遇到错误: 1 cv2.cv2 has no attribute 'face' 经过一顿查,,,各种走弯路 最后一下子就解决了: pip install opencv-pyth ...
-
标签中的rel属性的含义
rel与rev属性相同,它们都是属于LinkTypes属性. rel 属性 -- rel属性,描述了当前页面与href所指定文档的关系, rel是relationship(关系)的英文缩写. rev ...
-
解决";authentication token manipulation error";
昨天安装是Ubuntu Server. 配置好了几个软件后就忘记继续了...今天打开,居然忘记了密码...真是的.. 后来还是要改了. 不想重新弄什么的了..百度了下怎么改密码...然后就有一篇 ...
-
SqlConnection 无法设置连接超时
1.最有效的方法:对表格建立索引 2 在连接字符串中设置 Connection Timeout (默认15秒)3 设置 SqlCommand.CommandTimeout(默认是 30 秒)