如何在 Android 中处理 ListView 点击
Posted
技术标签:
【中文标题】如何在 Android 中处理 ListView 点击【英文标题】:How to handle ListView click in Android 【发布时间】:2011-01-28 21:55:18 【问题描述】:如何监听 ListView 上的点击事件?
这就是我现在拥有的
ListView list = (ListView)findViewById(R.id.ListView01);
...
list.setAdapter(adapter);
当我执行以下操作时
list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
public void onItemSelected(AdapterView parentView, View childView,
int position, long id)
setDetail(position);
public void onNothingSelected(AdapterView parentView)
);
点击后似乎没有任何作用。 所有这些代码都存在于一个扩展 Activity 的类中。
【问题讨论】:
【参考方案1】:在您的列表视图中,使用setOnItemClickListener
【讨论】:
您如何将数据发送到该详细视图? (就像 youtube 点击视频一样) 首先,该类必须实现点击监听器:实现 OnItemClickListener 然后为ListView设置一个监听器 yourList.setOnItemclickListener(this);最后,创建 clic 方法: @Override public void onItemClick(AdapterView> parent, View view, int position, long id) Toast.makeText(MainActivity.this, "You Clicked at " +countries[+ position], Toast.LENGTH_SHORT).show(); 【参考方案2】:假设 ListView 对象为 lv,请执行以下操作-
lv.setClickable(true);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
Object o = lv.getItemAtPosition(position);
/* write you handling code like...
String st = "sdcard/";
File f = new File(st+o.toString());
// do whatever u want to do with 'f' File object
*/
);
【讨论】:
lv
在onItemClick
中不可访问。有什么好办法解决这个问题?
@shinjin 最终确定。 final ListView lv = (ListView) findViewById(R.id.your_list_view);
干净方式:Object o = ((ListView)arg0).getItemAtPosition(position);
这里是文档的链接:developer.android.com/reference/android/widget/…【参考方案3】:
您需要在适配器类的 getView() 方法中设置膨胀视图“可点击”和“能够监听点击事件”。
convertView = mInflater.inflate(R.layout.list_item_text, null);
convertView.setClickable(true);
convertView.setOnClickListener(myClickListener);
并在您的 ListActivity 中声明点击监听器,如下所示,
public OnClickListener myClickListener = new OnClickListener()
public void onClick(View v)
//code to be written to handle the click event
;
仅当您通过扩展 BaseAdapter 自定义适配器时才适用。
有关详细信息,请参阅 ANDROID_SDK/samples/ApiDemos/src/com/example/android/apis/view/List14.java
【讨论】:
但这并不能确定点击的是什么项目,这使得它或多或少对列表无用?对吗? 您可以将标签设置为convertView并在onClick中进行检查。使用标签可以识别单击的项目... 我找到了一个比适配器中的标签更优雅的解决方案,它存储一个 setOnClickListener 引用并在 onClick(View v) 方法上调用它。然后活动可以接收具有该位置的事件。 您的 onClick 方法错误。应该是 onItemClick(AdapterView> parent, View view, int position, long id) @IgorGanapolsky 没有错……!!这是处理点击事件的另一种方式。虽然现在不推荐。 [Android 文档] (developer.android.com/reference/android/view/…)。你所说的已经在 Aditya Mehta 的回答中了。【参考方案4】:我之前的两个答案都是正确的-您可以使用OnItemClickListener
。
请注意OnItemClickListener
和OnItemSelectedListener
之间的区别虽然听起来很微妙,但实际上很重要,因为项目选择和焦点与AdapterView
的触摸模式有关。
默认情况下,在触摸模式下,没有选择和焦点。 您可以查看here 以获取有关该主题的更多信息。
【讨论】:
【参考方案5】:此解决方案非常简约,不会弄乱您的代码。
在您的 list_item.xml(不是 listView!)中分配属性 android:onClick,如下所示:
<RelativeLayout android:onClick="onClickDoSomething">
然后在你的活动中调用这个方法:
public void onClickDoSomething(View view)
// the view is the line you have clicked on
【讨论】:
很好的解决方案,但是没有办法获得点击项目的位置 @BilalŞimşek 很长一段时间我都没有使用 Android,但是如果view
可以包含一些元数据,那么它可能是获取位置的方式。【参考方案6】:
你必须使用有人说的setOnItemClickListener
。
代码应该是这样的:
listView.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
// When clicked, show a toast with the TextView text or do whatever you need.
Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
);
【讨论】:
【参考方案7】:首先,该类必须实现点击监听器:
implements OnItemClickListener
然后给ListView设置一个监听器
yourList.setOnItemclickListener(this);
最后,创建 clic 方法:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id)
Toast.makeText(MainActivity.this, "You Clicked at " +countries[+ position], Toast.LENGTH_SHORT).show();
您可以查看并下载代码here
【讨论】:
【参考方案8】:在您的活动中使用 setOnItemClickListener() api。以下是示例。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<> parent, View view, int position, long id)
// your code here.
);
【讨论】:
【参考方案9】:在 Kotlin 中,向您的 listView 添加一个监听器,就像 java 一样简单
your_listview.setOnItemClickListener parent, view, position, id ->
Toast.makeText(this, position, Toast.LENGTH_SHORT).show()
【讨论】:
以上是关于如何在 Android 中处理 ListView 点击的主要内容,如果未能解决你的问题,请参考以下文章
在listview中使用意图时如何在android中处理NullPointerException?
android解决ScrollView嵌套ListView不能下拉刷新