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

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,特别注意:在清单文件中注册网络权限。
展示效果:
这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值