【问题标题】:Listview is showing only one row when showing json data in android在android中显示json数据时Listview只显示一行
【发布时间】: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()

标签: android json listview


【解决方案1】:

首先,不要将 listview.setOnItemClickListener 放在一个循环中。那没有任何作用。而是将其添加到适配器的 getView() 方法中。`

row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          HashMap<String, String> user = sessionManager.getUserDetails();
                String message = user.get(SessionManager.JSON_MESSAGE);
                Intent i = new Intent(context, MessageDetails.class);
                i.putExtra("message", message);
                startActivity(i);
        }
    });

然后,在 while 循环中添加所有列表项后设置适配器。

【讨论】:

  • 我没有得到列表视图上的所有项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多