Android ListView中的OnItemClickListener和OnClickListener
我为自定义ListAdapter中的每一行都有一个自定义视图,我正在尝试执行onClick操作并获取列表中单击的行位置Android ListView中的OnItemClickListener和OnClickListener,android,listview,Android,Listview,我为自定义ListAdapter中的每一行都有一个自定义视图,我正在尝试执行onClick操作并获取列表中单击的行位置 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="matc
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingLeft="10dip" android:id="@+id/itemRoot" android:clickable="false">
<TextView android:layout_width="wrap_content" android:text="TextView"
android:layout_height="wrap_content" android:id="@+id/itemTxt"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"></TextView>
<TextView android:layout_toRightOf="@+id/itemTxt" android:text="TextView"
android:layout_height="wrap_content" android:layout_alignBottom="@+id/itemTxt"
android:id="@+id/amountTxt" android:paddingLeft="6dip"
android:layout_centerVertical="true" android:layout_width="match_parent"></TextView>
<ImageView android:id="@+id/delBtn" android:layout_height="wrap_content"
android:src="@drawable/delete" android:layout_width="wrap_content"
android:layout_alignParentRight="true" android:paddingRight="10dip"
android:layout_centerVertical="true"></ImageView>
</RelativeLayout>
我想知道什么时候单击TextView或ImageView,我还需要知道它来自列表中的哪一行。我已经尝试过使用McClickListener,它可以很好地获取单击来自的行。但是,一旦我为视图注册了OnClick侦听器,就会跳过oninemclicked()方法并立即执行OnClick(),但是无法获取视图所在的行位置(或者至少我不知道是否)
如果我将视图的clickable设置为false,则会调用OnItemClick get,并尝试对给定视图手动调用performClick()。但这只适用于根元素(RelativeLayout),如果单击来自布局内部的TextView,则单击不会传播
我真的不知道如何在列表中同时获得位置和执行onClick操作
欢迎有任何想法
Alex您可以从
ListAdapter
的重写getView
方法中为每个ImageView
和TextView
分配适当的OnClickListener
在该方法中,您知道项的位置,因此可以将其传递给自定义侦听器类,并根据需要在其中使用它:
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
// TODO: instantiate the layout
// here I call a super method
final View view = super.getView(position, convertView, parent);
final TextView textView = (TextView)view.findViewById(R.id.itemTxt);
textView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i("Click", "TextView clicked on row " + position);
}
});
final ImageView imageView = (ImageView)view.findViewById(R.id.delBtn);
imageView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i("Click", "ImageView clicked on row " + position);
}
});
return view;
}
您需要扩展TextView等,覆盖click方法,执行适当的操作,然后技巧是返回false,以便将其传播到listview。让OnClickListener与创建活动位于同一类中的另一个可能选项是将OnClickListener添加到活动
中
public class DisplayListCustom extends Activity implements OnItemClickListener
然后将自定义列表设置为侦听
ListView list = (ListView)findViewById(R.id.custom_list);
list.setClickable(true);
list.setOnItemClickListener(this);
list.setAdapter(new CustomListAdapter(getApplicationContext(), listItems));
最后,在onItemClick返回中,您可以使用资源ID找到内部视图
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
LinearLayout listItem = (LinearLayout) v;
TextView clickedItemView = (TextView) listItem.findViewById(R.id.name);
String clickedItemString = clickedItemView.getText().toString();
Log.i("DisplayListCustom", "Click detected " + clickedItemString + ", position " + Integer.toString(position));
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
LinearLayout列表项=(LinearLayout)v;
TextView clickeditView=(TextView)listItem.findViewById(R.id.name);
String clickedItemString=clickedItemView.getText().toString();
Log.i(“DisplayListCustom”、“Click detected”+clickedItemString+”,位置“+Integer.toString(位置));
这就是我使用的解决方案。我在自定义布局容器中使用了LinearLayout,但我认为这同样适用于RelativeLayout。在布局中,当相对于另一个视图定位视图时,您应该指定锚定id,而不使用+
符号:android:layout\u-toRightOf=“@id/itemTxt”
和android:layout\u alignBottom=“@id/itemTxt”
。在为视图创建新id时使用“@+id/itemTxt”
(因此在android:id
属性的值中)。所有这些代码都是自动生成的,但我会记住:)AlexI想知道是否有一种方法可以重写,该方法会返回false,并使人误以为事件没有被消耗。谢谢Hanks rekaszeru,这实际上是一个非常简洁的解决方案。很好!我更喜欢这种方法而不是rekaszeru使用的匿名类方法戈斯特德