JSON数据解析后显示在listview上并且可上滑加载更多

JSON文本很简单,只放了两个数据

 [{"number":"17817771329.I'm no.1","money":"0"},
{"number":"13538046947","money":"0"},
{"number":"13538046775","money":"0"},
{"number":"13538046740","money":"0"},
{"number":"13538046721","money":"0"},
{"number":"13538046701","money":"0"},
{"number":"13538046639","money":"0"},
{"number":"13538046609","money":"0"},
{"number":"13538046584","money":"0"},
{"number":"13538046581","money":"0"},
{"number":"17817771329I'm no.2","money":"0"}]

我已经把JSON文本已经放在DEMO项目里面了。

    private void readFromAssets() {
        try {
            InputStream is = getAssets().open("test.txt");//此处为要加载的json文件名称
            String text = readTextFromSDcard(is);
            handleCitiesResponse(text);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.d("readFromAssets", e.toString());
        }
    }

    private String readTextFromSDcard(InputStream is) throws Exception {
        InputStreamReader reader = new InputStreamReader(is, "GB2312");
        BufferedReader bufferedReader = new BufferedReader(reader);
        StringBuffer buffer = new StringBuffer("");
        String str;
        while ((str = bufferedReader.readLine()) != null) {
            buffer.append(str);
            buffer.append("\n");
        }
        return buffer.toString();//把读取的数据返回
    }

直接获取本地txt文本拿到json数据

如果有服务器的可以直接用方法

    private void init() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient.Builder().
                        connectTimeout(10, TimeUnit.SECONDS)//设置连接超时时间
                        .readTimeout(15, TimeUnit.SECONDS).build();//设置读取超时时间;
                //服务器返回的地址
                Request request = new Request.Builder()

                        .url("http://10.0.2.2:8088/date.json").build();

                try {
                    Response response = okHttpClient.newCall(request).execute();
                    //获取到数据
                    String date = response.body().string();
                    //把数据传入解析josn数据方法
                    handleCitiesResponse(date);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    if(e instanceof SocketTimeoutException) {//判断超时异常
                        Looper.prepare();
                        Toast.makeText(getApplicationContext(), "网络超时,请确认网络是否正常。", Toast.LENGTH_LONG).show();
                        Looper.loop();
                    }
                    if(e instanceof ConnectException) {//判断连接异常
                        Looper.prepare();
                        Toast.makeText(getApplicationContext(), "连接超时,请确认网络是否正常。", Toast.LENGTH_LONG).show();
                        Looper.loop();
                    }
                }
            };
        }).start();
    }
用okhttp方法获取服务器
url("http://10.0.2.2:8088/date.json")

直接把地址修改一下就可以了。

okhttp使用需要在配置build.gradle里加上

compile 'com.squareup.okhttp3:okhttp:3.4.1'
在判断连接超时连接异常的时候,不能直接吐司,需要在吐司前后加上
Looper.prepare();
Looper.loop();

不然就会出错误

接下来看一下json解析

    private void handleCitiesResponse(String date) {
        //判断数据是空
        if (date != null) {
            try {
                JSONArray jsonArray = new JSONArray(date);
                //将字符串转换成jsonObject对象
                    //遍历*/
                for (int i = 0; i<jsonArray.length(); i++) {

                    JSONObject object = jsonArray.getJSONObject(i);

                    Map<String, Object> map = new HashMap<>();
                    //获取到json数据中的activity数组里的内容name
                    String number = object.getString("number");
                    //获取到json数据中的activity数组里的内容startTime
                    String money = object.getString("money");
                    //存入map
                    map.put("number", number);
                    map.put("money", money);

                    //ArrayList集合
                    list.add(map);
                }
                Message message = new Message();
                message.what = 1;
                handler.sendMessage(message);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

重要的部分都用注释加上了,这个也是比较基础的,虽然我也是新手。


listview适配器。

    public class Mybaseadapter extends BaseAdapter {

        ArrayList<Map<String, Object>> getmList() {
            return mList;
        }

        private ArrayList<Map<String, Object>> mList;

        Mybaseadapter(ArrayList<Map<String, Object>> mList) {
            this.mList = mList;
        }

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

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

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

接下来就是把JSON解析的数据绑定在对应的textview上

@Override
        public View getView(final int position, View convertView, final ViewGroup parent) {
            //     ViewHolder viewHolder = null;

            final ViewHolder viewHolder;

            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = getLayoutInflater().inflate(R.layout.listview_text, null);
                viewHolder.number = (TextView) convertView.findViewById(R.id.tv1);
                viewHolder.money = (TextView) convertView.findViewById(R.id.tv2);
          //      viewHolder.no = convertView.findViewById(R.id.tv);

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            Map<String, Object> bean = mList.get(position);
            viewHolder.number.setText(bean.get("number").toString());
            viewHolder.money.setText(bean.get("money").toString());
        //   viewHolder.no.setText(position + "/" + mList.size() + "/" + list.size());
            return convertView;
        }

布局里比较简单,主布局只放了一个listview

内容布局放了2个textview

还有一个加载布局。

附上效果图


 
 

DEMO项目地址:DEMO下载

适合新手参考,demo可以直接用,不复杂。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云轩。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值