在view

时间:2017-04-18 07:36:52

标签: android json listview

我正在尝试在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();
    }

1 个答案:

答案 0 :(得分:0)

首先,不要将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循环中添加所有列表项后设置适配器。