【发布时间】:2017-04-18 07:36:51
【问题描述】:
我正在尝试在 android 的 listview 中显示 json 数据。我完美地获取了 json 数据,但是当我试图在 listview 中显示它时,只得到一行。 我想根据项目点击显示活动中每一行的数据。在这里,我不明白如何根据单击的项目从 json 传递数据。
这是我的代码:
public class CustomAdapter extends ArrayAdapter {
List list = new ArrayList();
public CustomAdapter(Context context, int resource) {
super(context, resource);
}
public void add(DataProvider dataProvider) {
super.add(dataProvider);
list.add(dataProvider);
}
@Override
public int getCount() {
return list.size();
}
@Nullable
@Override
public Object getItem(int position) {
return list.get(position);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View row = convertView;
dataProviderHolder holder;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.custom_list, parent, false);
holder = new dataProviderHolder();
holder.name = (TextView) row.findViewById(R.id.name);
holder.subject = (TextView) row.findViewById(R.id.subject);
holder.date = (TextView) row.findViewById(R.id.date);
holder.time = (TextView) row.findViewById(R.id.tim);
row.setTag(holder);
} else {
holder = (dataProviderHolder) row.getTag();
}
DataProvider provider = (DataProvider) this.getItem(position);
holder.name.setText(provider.getName());
holder.subject.setText(provider.getSubject());
holder.date.setText(provider.getDate());
holder.time.setText(provider.getTime());
return row;
}
static class dataProviderHolder {
TextView name, subject, date, time;
}
}
Json 解析:
listView = (ListView) findViewById(R.id.list);
sessionManager = new SessionManager(this);
listView.setAdapter(customAdapter);
HashMap<String, String> user = sessionManager.getUserDetails();
json_string = user.get(SessionManager.JSON_STRING);
try {
String name, subject, message, date, time;
jsonObject = new JSONObject(json_string);
jsonArray = jsonObject.getJSONArray("message");
int count = 0;
while (count < jsonObject.length()) {
JSONObject object = jsonArray.getJSONObject(count);
name = object.getString("name");
subject = object.getString("subject");
message = object.getString("message");
date = object.getString("date");
time = object.getString("time");
sessionManager.getJsonMesssage(message);
DataProvider dataProvider = new DataProvider(name, subject, date, time);
customAdapter.add(dataProvider);
count++;
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
HashMap<String, String> user = sessionManager.getUserDetails();
String message = user.get(SessionManager.JSON_MESSAGE);
Intent i = new Intent(MessageList.this, MessageDetails.class);
i.putExtra("message", message);
startActivity(i);
}
});
}
} catch (JSONException e) {
e.printStackTrace();
}
【问题讨论】:
-
你只得到一个数据,所以它只显示一个数据
-
添加item后有没有试过customAdapter.notifyDatasetChanged()???
-
+1 到@SujithNiraikulathan,在适配器的方法
add(DataProvider )中添加notifyDatasetChanged();作为最后一行(在list.add()之后),还在while 循环中添加Log.i()以确保有多少项已添加到适配器中,也许您在 json 中获得了 1 项,同样按照下面的 Nirup 回答,在 while 循环之后移动setOnItemClickListener()