如何在ArrayAdapter上设置onClickListener?

54
我正在创建以下类别:
// All necessary imports are here

public class More extends Activity {

    String[] MoreItems = { "Transfers", "Budgets", "Branches", "Tools", "News",
            "Customer Service", "Settings", "Help", "About" };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.more_view);

        ListView moreListView = (ListView) findViewById(R.id.moreListView);
        MoreListAdapter listAdapter = new MoreListAdapter();
        moreListView.setAdapter(listAdapter);

        // accountsTypeListView.setOnItemClickListener(listClickListner);
    }

    class MoreListAdapter extends ArrayAdapter<String> {
        MoreListAdapter() {
            super(More.this, R.layout.list_item, MoreItems);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View row;

            if (convertView == null) {
                LayoutInflater inflater = getLayoutInflater();
                row = inflater.inflate(R.layout.list_item, parent, false);
            } else {
                row = convertView;
            }
            TextView tv = (TextView) row.findViewById(R.id.textItem);

            tv.setText(getItem(position));

            return row;
        }
    }
}

它将生成列表,我想在相应的点击上调用相应的活动,例如如果用户点击转移,则会显示转移活动, 如何在此列表上调用onClickListener,并如何在单击时启动Activity。


你想在ListView的每个项目上设置OnClickListener,还是在每个项目的TextView上设置? - Houcine
row.setOnClickListener(this); ..... startActivity(this, someIntent);row.setOnClickListener(this); .... 调用startActivity(this, someIntent); - Blundell
4个回答

62

你也可以这样做。

moreListView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        // TODO Auto-generated method stub
        Log.d("############","Items " + MoreItems[arg2] );
    }
});

4
请将以下内容直接放置在你设置适配器的位置下方:moreListView.setAdapter(listAdapter); - localhost

49

有两种方法处理每一行的点击事件。

1)如果您的类继承自ListActivity,可以重写以下方法。

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
  super.onListItemClick(l, v, position, id);
  //do something here using the position in the array
}

2) 在 getView() 方法中处理行点击事件

row.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

    }
});

第二种方法在单击搜索/刷新列表视图中的项目并在onclick方法内调用意图后崩溃!有什么解决办法吗?..当我们使用自己的搜索过滤器时,问题就出现了。 - LOG_TAG
虽然有点老,但第二种方法非常适合在列表项中获取任何子元素的屏幕位置。 - Wenger

15

例如:

ListView lv = getListView();
lv.setAdapter(listAdapter); 
lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
        Intent i = new Intent(More.this, NextActvity.class);
        //If you wanna send any data to nextActicity.class you can use
        i.putExtra(String key, value.get(position));
        startActivity(i);
    }
});

1
你的“More”类必须扩展ListActivity而不是Activity,这样你就可以重写onListItemClick方法。
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    //do something here using the position in the arrya
}

编辑:忘了说,在你的布局中,你的ListView必须被命名为

android:id="@android:id/list"

如何在每个项目上设置onClick监听器? - Chatar Veer Suthar
每个项目都将接收点击。您只需使用所点击的项目的位置即可知道哪一个,例如MoreItems [position]。 - Johann
我们应该实现onclicklistener吗? - Chatar Veer Suthar
在onListItemClick中处理数组中的每个项目,不需要返回任何东西! - Johann
3
唯有这个回答提及了一个至关重要的细节,即使用onListItemClick覆盖需要扩展ListActivity类。 - Jade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接