我有一个自定义ListView
项目,其中包含ImageButton
,当我点击它时,点击事件不会通过,直到整个列表项目与之交互,例如滚动列表或点击列表项上的其他位置。因此,例如,如果我单击ImageButton 5次,则不会发生任何事情,但是当我滚动列表时,所有5个点击事件将同时发生。
经过大量的研究,我发现这是一个常见的问题,但到目前为止,我发现的解决方案都没有对我有用。 This question在学习视图交互的一些怪癖方面非常有用,而且我发现的大多数其他解决方案都使用了与该问题上接受的答案类似的方法,但不幸的是,它们都没有适用于我的特定情况。
所以我需要做的是处理列表项上的ImageButton的click事件,以及列表项本身的click事件。我已尝试在此列表显示中涉及的几乎所有视图元素上设置android:focusable="false"
和android:focusableInTouchMode="false"
。我还尝试过以编程方式设置这些属性。我还尝试在多个视图元素上设置android:descendantFocusability="blockDescendants"
,包括ListView
,行项目的LinearLayout
以及包含所有这些内容的CardView
。
关于所有这一切的令人困惑的部分是,我在同一个应用程序的另一个Activity中工作得很好。我在ImageButton
的自定义行布局中有一个ListView
,而onClick事件对此工作正常。所以它必须是我在此活动上的设置。这是一些代码:
我的自定义getView()
的{{1}}:
BaseAdapter
我个人观点持有者的观点通胀:
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;
}
这是我自定义行布局的XML ...
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 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>
来禁用SearchView和其他一些用户界面,当SearchView获得焦点时,我的getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
项突然按预期工作。所以我猜这个问题与ListView
或它没有焦点的窗口有关,因此点击事件不会通过,直到屏幕上的某些内容获得焦点
奇怪的是,当键盘显示在屏幕上时,我可以单击列表项及其ImageButtons,并正确处理所有点击事件。但是当我关闭键盘时,它再次断开。
答案 0 :(得分:0)
ListView存在已知的问题,干扰了每个项目内的视图的触摸事件。您应该切换到RecyclerView。对于新应用程序而言,ListView基本上已被弃用,而RecyclerView正在成为其替代品。