OnItemCLickListener不能在listview中工作
Activity
课程代码:
conversationList = (ListView)findViewById(android.R.id.list); ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails); conversationList.setAdapter(conversationArrayAdapter); conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { Log.d("test","clicked"); } });
Adapter
类中的getView
函数:
if (v == null) { LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(leftSideMessageNumber.equals(m.getTo())) { v = vi.inflate(R.layout.conversation_list_item_format_left, null); } else { v = vi.inflate(R.layout.conversation_list_item_format_right, null); } }
在膨胀时使用两个xml是否有问题?
我刚刚从这里找到解决方案..但通过深入点击…
如果列表中的任何行项目包含可聚焦或可点击的视图,则OnItemClickListener
将不起作用。
行项目必须有一个像android:descendantFocusability="blocksDescendants"
。
在这里你可以看到例子,你的列表项目应该是什么样子。 你的列表项xml应该是… row_item.xml(your_xml_file.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:baselineAligned="false" android:descendantFocusability="blocksDescendants" android:gravity="center_vertical" > // your other widgets here </LinearLayout>
问题是您的布局包含可聚焦或可点击的项目。 如果视图包含可聚焦或可点击的项目,则不会调用OnItemCLickListener。
点击这里获取更多信息。
如果不是这种情况,请发布您的布局xmls之一。
对于我的列表,我的行还有其他可以单击的东西,像按钮,所以做一个毯子blocksDesndants不起作用。 相反,我在按钮的xml中添加一行:
android:focusable="false"
这样可以防止按钮阻止点击行,但仍然可以让按钮获得点击。
你需要在你的listview_item.xml中做两个步骤
- 设置根布局:
android:descendantFocusability="blocksDescendants"
- 在这个项目中设置任何可聚焦或可点击的视图:
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
这里是一个例子:listview_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:gravity="center_vertical" android:orientation="vertical" android:descendantFocusability="blocksDescendants"> <RadioButton android:id="@+id/script_name_radio_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textStyle="bold" android:textColor="#000" android:padding="5dp" android:clickable="false" android:focusable="false" android:focusableInTouchMode="false" /> </LinearLayout>
在listview的自定义行布局的按钮标签内使用下面的代码
android:focusable="false" android:clickable="false"
我有同样的问题,我只是看到我不小心设置:
@Override public boolean isEnabled(int position) { return false; }
在我的CustomListViewAdapter类。
通过改变这个:
return true;
我已经设法解决这个问题。 万一有人犯了同样的错误
如果你有textviews,按钮或stg只能在你的行视图中可点击或可选
android:descendantFocusability="blocksDescendants"
是不足够的。 你必须设置
android:textIsSelectable="false"
到你的textviews和
android:focusable="false"
到你的按钮和其他可调焦的物品。
即使我有同样的问题,我有复选框,做了以下掩盖itemClickListener的工作,
添加了以下属性到复选框,
android:focusable="false" android:focusableInTouchMode="false" android:clickable="false"
和ItemClickListner开始工作。
对于详细的例子,你可以通过链接,
http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/
希望它可以帮助干杯!
我解决了这个答案的帮助
1.在list_items.xml的Linear Layout中添加以下代码android:descendantFocusability="blocksDescendants"
2.在list_items.xml中查看LinearLayout的视图
android:focusable="false"
使用android:descendantFocusability
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="80dip" android:background="@color/light_green" android:descendantFocusability="blocksDescendants" >
在根布局中添加上面
我有同样的问题,并尝试所有提到的解决方案无济于事。 通过测试,我发现使文本可选是阻止监听器被调用。 所以通过将其切换为false或删除它,我的监听器再次被调用。
android:textIsSelectable="false"
希望这能帮助像我这样陷入困境的人。
两个很棒的解决方案是这样的,如果你从一个片段扩展ListFragment,知道mListView.setOnItemClickListener
在你的活动被创建之前不会被调用,这确保了它在创建活动时被设置
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) { // Do the onItemClick action Log.d("ROWSELECT", "" + rowId); } }); }
在查看ListFragment的源代码时,我遇到了这个问题
public class ListFragment extends Fragment { ........................................... ................................................ final private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { onListItemClick((ListView)parent, v, position, id); } }; ................................................................ ................................................................ public void onListItemClick(ListView l, View v, int position, long id) { } }
一个onItemClickListener
对象被附加,它调用onListItemClick()
这样的其他类似的解决方案,它以完全相同的方式工作是重写onListItemClick()
@Override public void onListItemClick(ListView l, View v, int position, long rowId) { super.onListItemClick(l, v, position, id); // Do the onItemClick action Log.d("ROWSELECT", "" + rowId); }
我已经尝试了以上所有,没有任何工作。
我解决了这个问题,如下所示:
首先我定义一个名为ListButton
的自定义按钮
public class ListButton extends android.widget.Button { private ButtonClickedListener clickListener; public ListButton(Context context) { this(context, null); } public ListButton(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ListButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setClickListener(ButtonClickedListener listener) { this.clickListener = listener; } @Override public boolean isInTouchMode() { return true; } @Override public boolean onTouchEvent(MotionEvent event) { return false; } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_UP: eventClicked(); break; case MotionEvent.ACTION_CANCEL: break; case MotionEvent.ACTION_MOVE: break; default : } return true; } private void eventClicked() { if (this.clickListener!=null) { this.clickListener.ButtonClicked(); } } }
XML看起来像:
<dk.example.views.ListButton android:id="@+id/cancel_button" android:layout_width="125dp" android:layout_height="80dp" android:text="Cancel" android:textSize="20sp" android:layout_margin="10dp" android:padding="2dp" android:background="#000000" android:textColor="#ffffff" android:textStyle="bold" />
然后我定义了我自己的ButtonClicked
Listener接口:
public interface ButtonClickedListener { public void ButtonClicked(); }
然后我使用我自己的侦听器,就像它是正常的OnClickListener
:
final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button); cancelButton.setClickListener(new ButtonClickedListener() { @Override public void ButtonClicked() { //Do your own stuff here... } });
如果你想同时使用简单的点击和长按列表视图项目更好的方式来实现,将使用上下文菜单进行长时间的点击。 避免使用setItemLongClickListener,特别是如果您的列表视图有多个行布局。
面对同样的问题,试了几个小时。 如果您尝试了上述所有操作,请尝试将listview的layout_width和list项目更改为wrap_content的match_parent。
以上所有都失败了。 但是,我解决了这个问题(经过几个小时的轰动 – 谷歌,如果你正在倾听,请考虑修复下面遇到的编译器错误,如果可能的话)
你真的要小心你在这里添加到你的xml布局的android属性(在这个原始问题中,它被称为list_items.xml)。 对我来说,导致这个问题的原因是我已经从EditText视图切换到TextView,并从变化(在我的情况下,inputType)具有剩余的属性cruft。 编译器没有抓住它,当我去运行应用程序时,可点击性失败。 仔细检查您的布局xml节点中的所有属性。