【问题标题】:onClickListener ListViewonClickListener 列表视图
【发布时间】:2014-04-04 22:49:40
【问题描述】:

我的Contacts 活动中有一个联系人列表,该列表使用此方法填充:

public void allyGetAllDelegate(HttpResponse response, JSONObject result)
{
    if(result != null)
    {
        ListView listContacts = (ListView) this.listContactsView.findViewById(R.id.listContacts);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);

        JSONArray toIterate;

        try {
            toIterate = result.getJSONArray("data");

            for(int i=0; i<toIterate.length(); i++)
            {
                adapter.add(toIterate.getJSONObject(i).get("name").toString());
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        listContacts.setAdapter(adapter);
    }
}

当我执行这一行时:

adapter.add(toIterate.getJSONObject(i).get("name").toString());

我想在每个项目及其内部设置一个onClickListener,意图使用额外的toIterate.getJSONObject(i).toString() 进行另一个活动。

我怎样才能做到这一点?

【问题讨论】:

  • 给ListView添加一个OnItemClickListener怎么样?
  • 但是我如何跟踪我想要额外发送的对象?
  • onItemClick()中传入的第三个参数,通常命名为position,本质上就是对象在ArrayList中的索引。

标签: android listview android-intent


【解决方案1】:

试试这个

 @Override
protected void onListItemClick(ListView l, View v, int position, long id) {
          //Do something when an item is clicked 
}

【讨论】:

  • 使用 setOnItemClickListener(new OnItemClickListener() {...});谢谢
【解决方案2】:

您可以将JSONObject-s 存储在 ArrayAdapter 中并稍后检索它们。

所以你的代码变成了

public void allyGetAllDelegate(HttpResponse response, JSONObject result) {
    if(result != null)  {
    ListView listContacts = (ListView) this.listContactsView.findViewById(R.id.listContacts);

    final Mydapter adapter = new MyAdapter(this, android.R.layout.simple_list_item_1);

    JSONArray toIterate;

    try {
        toIterate = result.getJSONArray("data");

        for(int i=0; i<toIterate.length(); i++)
        {
            adapter.add(toIterate.getJSONObject(i));
        }

    } catch (JSONException e) {
         // handle exceptions here
    }

    listContacts.setAdapter(adapter);
    listContacts.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent i = new Intent(/*your intent*/);
            i.putExtra("extra", adapter.getItem(position).toString());
            startActivity(i);
        }
    });
    }
}

您还必须扩展 ArrayAdapter 并覆盖它的 getView

class MyAdapter extends ArrayAdapter<JSONObject> {

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater li = LayoutInflater.from(getContext());
    TextView tv = (TextView) li.inflate(android.R.layout.simple_list_item_1, null);
    tv.setText(getItem(position).get("name"));
    return tv;
}

}

【讨论】:

  • 那行不通!充气机如何在屏幕上输出 JSON?它会调用 .toString() 并打印很多我不想要的东西......
【解决方案3】:

我必须创建一个名为 contacts 的静态属性(接收 JSONArray)。 使用该属性和position 参数完成。

谢谢。

listContacts.setAdapter(adapter);
listContacts.setOnItemClickListener(new OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id)
    {
        try {
            Intent intent = new Intent(view.getContext(), ContactProfile.class);
            intent.putExtra("person", Contacts.contacts.getJSONObject(position).toString());
            startActivity(intent);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
});

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多