ListView展示Json数据小案例(堆糖)
2016-02-20 11:50
671 查看
MainActivity中的代码:
MyAdapter中的代码:
Bean实体类中的代码:
实体类本质上就是一个容器,不同属性封装各种数据,在listView中的Item需要时候再取出来对应数据用于展示。实体类代码比较多,举例子仅仅用它的两个属性就行了,重点介绍的是自动解析插件安装和使用
下载类中的代码:DownLoadBitmapAsyncTask
接口回调的代码,邮递员CallBack
注:
1,在布局文件中摆放listView,记得高度属性设置layout_height=match_parent,减少适配器中getView方法测量次数,优化listView性能。
2,新建listView中的Item布局文件,设置ImageView控件和TextView控件的基本代码就不再展示
3,特别注意:在清单文件中注册网络权限。
展示效果:
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,特别注意:在清单文件中注册网络权限。
展示效果:
相关文章推荐
- MAC上安装并破解最新SublimeText3103版本,安装PrettyJSON离线格式化json字符串
- JavaScript日期对象使用总结
- javascript中对变量类型的推断
- javascript入门实例五
- javascript入门实例四
- C# 将MSMQ消息转换成Json格式 【优化】
- javascript入门实例三
- js正则表达式验证手机号码和邮箱
- PhantomJs安装
- javascript入门实例二
- javascript
- javascript入门实例一
- eval解析JSON字符串的一个小问题
- jsp基础2:jsp标签和EL表达式
- javascript系统时间测试题
- jsp+servlet中乱码问题
- 解密javascript模块载入器require.js
- 【翻译】探究Ext JS 5和Sencha Touch的布局系统
- js中split函数的使用方法说明
- js二维数组定义和初始化的三种方法总结