如何在 ArrayAdapter 上设置 onClickListener?

Posted

技术标签:

【中文标题】如何在 ArrayAdapter 上设置 onClickListener?【英文标题】:How can I set onClickListener on ArrayAdapter? 【发布时间】:2012-01-26 18:37:15 【问题描述】:

我正在像下面这样上课

// 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 的每个项目或每个项目的 TextView 设置 OnClickListener 还是什么?? row.setOnClickListener(this); ..... startActivity(this, someIntent); 【参考方案1】:

你也可以这样做..

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] );
            

        );

【讨论】:

将其直接放在您在 moreListView.setAdapter(listAdapter); 处设置适配器的位置下方;【参考方案2】:

有两个选项来处理每一行的点击事件。

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 后在列表视图中搜索/刷新的项目上崩溃,同时在 onclick 方法中调用意图!有什么解决方案吗?...当我们使用自己的搜索过滤器时,问题就来了。 Necro,但是如果您需要获取列表项中任何子项的屏幕位置,则第二种方法会很棒。【参考方案3】:

例如:

 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);
            
          );

【讨论】:

【参考方案4】:

您的“更多”类必须扩展 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监听器? 每个项目都会收到点击。您只知道使用单击项目的位置是哪一个,例如更多项目[位置] 我们是否应该实现onclicklistner? 没必要! onListItemClick 为数组中的每个项目处理它 这是唯一提到使用onListItemClick覆盖类必须扩展ListActivity的关键细节的答案。

以上是关于如何在 ArrayAdapter 上设置 onClickListener?的主要内容,如果未能解决你的问题,请参考以下文章

带有 ArrayAdapter 的 ListView 未在 Android 11 上显示内容

使用按钮删除 Listview w/ArrayAdapter 中的选定项目

如何使用 SQLite 中的数据实现自定义 ArrayAdapter

Android - ArrayAdapter:将 TextView 设置为 SQLiteDatabase 中的值

android在使用ArrayAdapter时如何分配textViewResourceId

如何实现 Asynctask 在 ArrayAdapter 中加载图像