您的位置:首页 > Web前端 > JavaScript

ListView展示Json数据小案例(堆糖)

2016-02-20 11:50 671 查看
MainActivity中的代码:

public class MainActivity extends AppCompatActivity {
private ListView listView;
private List<Bean> list = new ArrayList<Bean>();
private String path = "http://www.duitang.com/napi/blog/list/by_category/?" +
"cate_key=5017d172705cbe10c0000061&start=0&limit=50";
private MyAsyncTask myAsyncTask;
private MyAdapter myAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}

//初始化
private void initViews() {
myAsyncTask = new MyAsyncTask();
myAsyncTask.execute(path);
listView = (ListView) findViewById(R.id.listView);
myAdapter = new MyAdapter(list, this);
listView.setAdapter(myAdapter);
}

//异步任务完成网络下载,下载json字符串
class MyAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
//借助网络工具类从网络下载json字符串
try {
String data = HttpUtils.httpGet(params[0]);
if (!TextUtils.isEmpty(data)) {
return data;
} else {
Toast.makeText(MainActivity.this, "网络下载失败", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//解析字符串
List<Bean> listBean = jsonStringToList(s);
list.clear();
//将解析得到的数据集合添加到数据源集合中
list.addAll(listBean);
//添加完数据,记得及时更新
myAdapter.notifyDataSetChanged();
}
}

//解析json字符串
List<Bean> jsonStringToList(String s) {
List<Bean> listBean = new ArrayList<>();
try {
JSONObject jsonObject = new JSONObject(s);
JSONObject data = jsonObject.getJSONObject("data");
JSONArray object_list = data.getJSONArray("object_list");
for (int i = 0; i < object_list.length(); i++) {
JSONObject photo_msg = object_list.getJSONObject(i);
JSONObject photo = photo_msg.getJSONObject("photo");
//此处得到的是图片的下载链接地址,不是图片本身,图片的下载需要开启另外一个异步任务
String photoPath = photo.getString("path");
String msg = photo_msg.getString("msg");
//解析之后,为实体类的属性赋值
Bean bean = new Bean();
bean.setSource_link(photoPath);
bean.setMsg(msg);
//将赋值后的实体类添加到listBean集合中
listBean.add(bean);
}
if (listBean.size() != 0) {
return listBean;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}


MyAdapter中的代码:

public class MyAdapter extends BaseAdapter {
private List<Bean> list;
private Activity activity;

public MyAdapter(List<Bean> list, Activity activity) {
super();
this.activity = activity;
this.list = list;
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = activity.getLayoutInflater().inflate(R.layout.layout_listview, parent, false);
holder.img = (ImageView) convertView.findViewById(R.id.photo);
holder.content = (TextView) convertView.findViewById(R.id.msg);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//取出实体类的值,设置给item中的控件,用于展示。
Bean bean = list.get(position);
holder.content.setText(bean.getMsg());
/**
* 下载图片是耗时操作,需要重新开启一个异步任务的下载类,
* 下载完毕后,从下载类把图片传递回来,需要用到接口回调(如果是Activity可以直接intent传值)
*/
//从实体类中取出下载图片的链接,给下载类执行下载任务
String photoPath = bean.getSource_link();
new DownloadBitmapAsyncTask(new CallBack() {
//匿名内部类为一接口,在其抽象方法的参数列表中获取到下载类中的图片,实现了图片的跨类传递
@Override
public void getBitmap(Bitmap bitmap) {
//拿到图片,设置给ImageView控件
holder.img.setImageBitmap(bitmap);
}
}).execute(photoPath);

return convertView;
}

class ViewHolder {
private ImageView img;
private TextView content;
}
}


Bean实体类中的代码:

实体类本质上就是一个容器,不同属性封装各种数据,在listView中的Item需要时候再取出来对应数据用于展示。实体类代码比较多,举例子仅仅用它的两个属性就行了,重点介绍的是自动解析插件安装和使用

package com.example.administrator.json;

/**
* 1,导入Gson.jar包插件,步骤:设置(齿轮和扳手那个按钮)—>Plugins(插件)
* —>Install plugin from disk ——>Restart,重启一下AndroidStudio就行了
* 2,复制需要解析的json代码片段,新建一个实体类.class文件,右键->Generate->GsonFormat,即可自动解析为实体类
*/
public class Bean {
private String source_link;
private String msg;

public void setSource_link(String source_link) {
this.source_link = source_link;
}

public void setMsg(String msg) {
this.msg = msg;
}

public String getSource_link() {
return source_link;
}

public String getMsg() {
return msg;
}


下载类中的代码:DownLoadBitmapAsyncTask

/**
* 用于完成下载图片的耗时操作
*/
public class DownloadBitmapAsyncTask extends AsyncTask<String, Void, Bitmap> {
//声明邮递员接口
private CallBack callBack;

public DownloadBitmapAsyncTask(CallBack callBack) {
this.callBack = callBack;
}

@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = HttpUtils.getBitmapFormUrl(params[0]);
if (bitmap != null) {
return bitmap;
}
return null;
}

@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
callBack.getBitmap(bitmap);
}
}


接口回调的代码,邮递员CallBack

/**
* 通过接口回调以抽象方法中参数的形式实现类之间的值传递,接口就相当于一个快递员
* 在MyAdapter需要图片,而图片存在于下载类中,
* 此时将携带图片的接口作为下载类构造函数的一个参数,
* 在MyAdapter中获取下载类对象时候就在参数列表中拿到图片了。
*/
public interface CallBack {
void getBitmap(Bitmap bitmap);
}


注:

1,在布局文件中摆放listView,记得高度属性设置layout_height=match_parent,减少适配器中getView方法测量次数,优化listView性能。

2,新建listView中的Item布局文件,设置ImageView控件和TextView控件的基本代码就不再展示

3,特别注意:在清单文件中注册网络权限。

展示效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: