如何在 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 中的值