当适配器包含带有 onClickListener 的按钮时,OnItemClickListener 无法正常工作
Posted
技术标签:
【中文标题】当适配器包含带有 onClickListener 的按钮时,OnItemClickListener 无法正常工作【英文标题】:OnItemClickListener does not working properly when adapter contains a button with onClickListener 【发布时间】:2011-09-29 09:47:11 【问题描述】:我已经为我的ListView
实现了一个适配器,它扩展了 BaseAdapter。
我的列表项包含每个按钮都有 OnClickListener。
为每个项目添加 OnclickLister 后,列表的 OnItemClickListener 停止工作。
如何解决?
代码
在我的活动中 -
ListView lv = (ListView) findViewById(R.id.list);
lv.setTextFilterEnabled(true);
lv.setItemsCanFocus(true);
lv.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
String debString = "position = " + position + " id = " + id;
Log.d(TAG, debString);
Toast.makeText(getApplicationContext(), debString, Toast.LENGTH_SHORT).show();
Contact selectedContact = dataVector.elementAt(position);
Bundle bundle = new Bundle();
bundle.putInt(Constants.POSITION, position);
bundle.putString(Constants.NAME, selectedContact.getName());
bundle.putString(Constants.MDN, selectedContact.getMdn());
bundle.putString(Constants.STATUS, selectedContact.getStatus());
String filePath = null;
if(contactsImagesProperties != null || !Utils.isNullOrEmpty((String) contactsImagesProperties.get(selectedContact.getMdn())))
filePath = (String) contactsImagesProperties.get(selectedContact.getMdn());
bundle.putString(Constants.IMAGE, filePath);
Intent intent = new Intent(context, ChildDisplayActivity.class);
intent.putExtras(bundle);
getParent().startActivityForResult(intent, 10);
在 getView() 中的 myBaseAdapter 中
bitmap = Bitmap.createScaledBitmap(bitmap, Constants.CHILD_ICON_WIDTH, Constants.CHILD_ICON_HEIGHT, false);
imageView.setImageBitmap(bitmap);
statusView.setText(Constants.StatusCodeHandler.getStatusDesc(dataVector.elementAt(position).getStatus(), context));
ImageButton imageButton = (ImageButton) view.findViewById(viewIds[3]);
imageButton.setOnClickListener(new OnClickListener()
public void onClick(View v)
Bundle bundle = new Bundle();
bundle.putInt(Constants.ACTION, Constants.CONTACT_LOCATION_CODE);
bundle.putString(Constants.MDN, dataVector.elementAt(position).getMdn());
MainActivity.bundle = bundle;
TabActivity mainActivity = (TabActivity) ((UsersListActivity)context).getParent().getParent();
TabHost tabHost = mainActivity.getTabHost();
tabHost.setCurrentTab(Constants.MAP_TAB_INDEX);
);
在 myListRaw.xml -
<ImageView android:src="@drawable/icon"
android:id="@+id/childListImageView"
android:layout_
android:layout_
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:layout_alignParentRight="true"/>
<TextView android:id="@+id/childListTextView"
android:layout_marginRight="5dp"
android:layout_
android:text="TextView"
android:layout_
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:layout_toLeftOf="@+id/childListImageView"
android:layout_centerVertical="true"/>
<TextView android:layout_
android:layout_marginLeft="5dp"
android:text="Child Status"
android:id="@+id/childListStatus"
android:layout_
android:layout_toLeftOf="@+id/childListTextView"
android:layout_marginRight="15dp"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:layout_centerVertical="true"/>
<ImageButton android:id="@+id/childListButton"
android:layout_
android:layout_
android:text="Loc"
android:layout_marginTop="5dp"
android:layout_alignParentLeft="true"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"/>
【问题讨论】:
一些代码会更好理解........ 您允许使用lv.setItemsCanFocus(true);
关注您的代码 - 尝试注释掉该行或将其设置为 false。
我已根据您的评论更改了它,但仍然存在问题。
【参考方案1】:
如果您将行的部分设置为可聚焦 (android:focusable="true"),则 ListView 的 OnItemClickListener 不会响应。看看吧
【讨论】:
所以给我们一些代码。 its hard to get the problem when we can
t 看看你做了什么
eyal,除非您已明确调用 setFocusable ( false )
,否则是的,它们是可聚焦的。您需要禁用按钮的焦点,但是您必须管理按钮的处理点击。我已经在我自己的应用程序中使用了这个 - 一旦你处理了点击,你就会隐式地使控件成为焦点。
@RivieraKid - 如果我是正确的,您还可以在行布局的 xml 文件中设置 android:focusable = "false"
您可能是对的 Fixus,我不确定创建单击侦听器是否也会使控件默认成为焦点。不管怎样,我认为你的答案是正确的。
我正在使用带 android:focusable = "false" 的 RelativeLayout 仍然有这个问题。以上是关于当适配器包含带有 onClickListener 的按钮时,OnItemClickListener 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章