如何将解析到的json数据显示到listview中

wonderofsky 2015-09-10 03:36:09
服务器返回的json数据已经得到了,但是一直无法显示到listview中去,大家看下是什么原因
这是MainActivity的代码:
package com.json.testj;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity{
private static final int JSON = 1;
private ListView listView;
private Button button;
private Handler handler;
private ArrayList<Knowledge> list;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)findViewById(R.id.button);
listView = (ListView)findViewById(R.id.question_knowledge);

handler = new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
Bundle bundle = msg.getData();
String json = bundle.getString("json");
list = new ArrayList<Knowledge>();
if(msg.what==JSON){
list = JSONUtil.parseJson(json);
Log.i("list", list.toString());
}
}
};

button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getResult();
ListAdapter adapter = new ListAdapter(getBaseContext(), list);
listView.setAdapter(adapter);
}
});
}

public void getResult(){
final String uri = "http://www.yuerme.com:8181/client/lore/queryLore.do?uid=";
new Thread(new Runnable() {
@Override
public void run() {
Bundle bundle = new Bundle();
String str = HttpUtils.getJsonContent(uri);
bundle.putString("json", str);
Message msg = new Message();
msg.setData(bundle);
msg.what=JSON;
handler.sendMessage(msg);
}
}).start();
}
}

这是获取json数据的代码:
package com.json.testj;

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONUtil {
public static ArrayList<Knowledge> parseJson(String jsonString){
ArrayList<Knowledge> list = new ArrayList<Knowledge>();
Knowledge knowledge = new Knowledge();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for(int i=0;i<jsonArray.length();i++){
JSONObject item = jsonArray.getJSONObject(i);
String title = item.getString("title");
String content = item.getString("content");
knowledge.setTitle(title);
knowledge.setContent(content);
list.add(knowledge);
}
} catch (JSONException e) {
e.printStackTrace();
}
Log.i("result", "json数据获取成功");
return list;
}
}
...全文
1870 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wonderofsky 2018-01-05
  • 打赏
  • 举报
回复
引用 11 楼 Liyan_Yanna 的回复:
楼主,请问你的Konwlege类怎么写的,我的ListView也显示不出数据,想借鉴一下
http://www.bejson.com/ 看这个网址,这个可以校验json数据是否是正确的格式,也可以根据json生成实体类。
ahh1005 2017-11-27
  • 打赏
  • 举报
回复
楼主,请问你的Konwlege类怎么写的,我的ListView也显示不出数据,想借鉴一下
wonderofsky 2015-09-10
  • 打赏
  • 举报
回复
引用 8 楼 daydreary 的回复:
值相同,是因为你的knowledge每次都是同一个对象。 new的语句放到循环里: for(int i = 0; i < jsonArray.length(); i++) { Knowledge knowledge = new Knowledge(); …… …… }
已经解决了,不过还是谢谢你,还是基本功不扎实啊。
daydreary 2015-09-10
  • 打赏
  • 举报
回复
顺带给楼主提个醒, 手动解析json时候, 使用opt方法代替get方法, 可以减少不必要的错误 getString() --------> optString()
daydreary 2015-09-10
  • 打赏
  • 举报
回复
值相同,是因为你的knowledge每次都是同一个对象。 new的语句放到循环里: for(int i = 0; i < jsonArray.length(); i++) { Knowledge knowledge = new Knowledge(); …… …… }
wonderofsky 2015-09-10
  • 打赏
  • 举报
回复
还有刚刚显示出来的结果全是一模一样的,这是为啥?调试了下,发现问题出现在for each循环里,但是问什么会出这个问题?
这是结果:

这是获取json数据的代码出现问题的位置
wonderofsky 2015-09-10
  • 打赏
  • 举报
回复
引用 5 楼 u012975370 的回复:
TextView 你写成了Textview ,v 你小写了
我擦,才注意到
聂建jian 2015-09-10
  • 打赏
  • 举报
回复
TextView 你写成了Textview ,v 你小写了
wonderofsky 2015-09-10
  • 打赏
  • 举报
回复
引用 2 楼 u011070145 的回复:
getResult(); 这里你请求的数据 是异步的
程序会往下执行
ListAdapter adapter = new ListAdapter(getBaseContext(), list);
listView.setAdapter(adapter);
所以你的ListView 是没有数据的

那两行代码应该放到 获取到数据 解析完 再添加到adapter中

if(msg.what==JSON){
list = JSONUtil.parseJson(json);
Log.i("list", list.toString());
}
在这里面加上那两行代码吧

改了之后报这个错误了,帮忙看下是什么问题,应该怎么解决

qq_26763799 2015-09-10
  • 打赏
  • 举报
回复
启动线程去加载的数据,可能那时已经adapter赋值空的list了,在handler里刷新下数据adapter.notigyDataSetChange(); PS:不一定有用,感觉你这获取json好奇怪,还是用框架联网请求数据吧,规范些
浅笑_JIE 2015-09-10
  • 打赏
  • 举报
回复
getResult(); 这里你请求的数据 是异步的 程序会往下执行 ListAdapter adapter = new ListAdapter(getBaseContext(), list); listView.setAdapter(adapter); 所以你的ListView 是没有数据的 那两行代码应该放到 获取到数据 解析完 再添加到adapter中 if(msg.what==JSON){ list = JSONUtil.parseJson(json); Log.i("list", list.toString()); } 在这里面加上那两行代码吧
wonderofsky 2015-09-10
  • 打赏
  • 举报
回复
忘了贴adapter的代码了,这是adapter的代码
package com.json.testj;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter {
	private ArrayList<Knowledge> alist;
	private LayoutInflater inflater;
	private TextView title,content;
	private Knowledge knowledge;
	
	public ListAdapter(Context context,ArrayList<Knowledge> list) {
		inflater = LayoutInflater.from(context);
		alist = list;
	}

	@Override
	public int getCount() {
		return alist.size()==0?0:alist.size();
	}

	@Override
	public Knowledge getItem(int position) {
		if(alist==null||alist.size()==0)
			return null;
		return alist.get(position);
	}

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if(convertView==null)
			convertView = inflater.inflate(R.layout.listitem, null);
		knowledge = getItem(position);
		title = (TextView)convertView.findViewById(R.id.title);
		title.setText(knowledge.getTitle().toString());
		content = (TextView)convertView.findViewById(R.id.content);
		content.setText(knowledge.getContent().toString());
		return convertView;
	}
}

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧