【发布时间】:2016-02-08 21:47:36
【问题描述】:
我有一个自定义的 ListView 项目,其中有一个 ImageButton,当我单击它时,单击事件不会发生,直到与整个列表项进行交互,例如滚动列表或点击列表项上的其他位置。因此,例如,如果我单击 ImageButton 5 次,什么都不会发生,但是当我滚动列表时,所有 5 个单击事件将同时发生。
经过大量研究,我发现这是一个常见问题,但到目前为止,我找到的解决方案都没有对我有用。 This question 在了解视图交互的一些怪癖方面非常有帮助,我发现的大多数其他解决方案都使用了与该问题的公认答案类似的方法,但不幸的是,它们都不适用于我的特定情况。
所以我需要做的是处理列表项上 ImageButton 的单击事件,以及列表项本身的单击事件。我已经尝试在该列表显示所涉及的几乎所有视图元素上设置android:focusable="false" 和android:focusableInTouchMode="false"。我也尝试过以编程方式设置这些属性。我还尝试在几个视图元素上设置android:descendantFocusability="blocksDescendants",包括ListView、行项目的LinearLayout,以及包含所有这些内容的CardView。
所有这些令人困惑的部分是,我在同一个应用程序的另一个 Activity 中运行良好。我在ListView 的自定义行布局中有一个ImageButton,并且onClick 事件可以正常工作。所以它必须与我在这个活动上的设置有关。这是一些代码:
我自定义BaseAdapter的getView():
public View getView(int position, View convertView, ViewGroup parent) {
FavoritesItemViewHolder favoriteItem = favoritesList.get(position);
if(convertView == null) {
convertView = favoriteItem.getNewConvertView(parent);
} else {
if(favoriteItem.getConvertView() == null) {
convertView = favoriteItem.getNewConvertView(parent);
} else {
convertView = favoriteItem.getConvertView();
}
}
return convertView;
}
我个人观点持有者的观点膨胀:
public View getNewConvertView(ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.favorites_list_item, parent, false);
TextView favoriteText = (TextView) convertView.findViewById(R.id.favoritesItemText);
favoriteText.setText(itemTitle);
//Here is where I'm setting the OnClickListeners for each row...
ImageButton clearButton = (ImageButton) convertView.findViewById(R.id.favoritesClearButton);
clearButton.setVisibility(View.VISIBLE);
if(itemTitle.equals(context.getResources().getString(R.string.no_favorites))) {
clearButton.setVisibility(View.INVISIBLE);
} else {
clearButton.setVisibility(View.VISIBLE);
clearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("CLEAR FAVORITE", "The clear button was just clicked on a favorites item...");
}
});
}
return convertView;
}
这是我的自定义行布局的 XML...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/favoritesListItemContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/favoritesItemText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:layout_gravity="center_vertical"
android:textSize="16sp"
android:textColor="@android:color/black"
android:layout_weight="0.9"/>
<ImageButton
android:id="@+id/favoritesClearButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:src="@drawable/ic_clear_x"
android:layout_gravity="center_vertical"
android:scaleType="centerInside"
android:adjustViewBounds="true"
android:background="@android:color/white"
style="?android:attr/borderlessButtonStyle"
android:layout_weight="0.1" />
</LinearLayout>
任何帮助将不胜感激。我完全被难住了。
更新
在此 Activity 中,我使用 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 来禁用 SearchView 和其他一些 UI,当 SearchView 获得焦点时,我的 ListView 项目突然按预期工作。所以我猜这与ListView 或没有焦点的窗口有问题,因此在屏幕上的某些内容获得焦点之前点击事件不会发生。
奇怪的是,当键盘显示在屏幕上时,我可以单击列表项及其 ImageButtons,并且所有单击事件都得到了正确处理。但是当我关闭键盘时,它又坏了。
【问题讨论】:
标签: android listview onclicklistener imagebutton