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

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

2018-04-25 21:13 113 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_35157303/article/details/80085571

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;
}
接下来就 3ff7 是把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可以直接用,不复杂。

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