【问题标题】:ImageButton click events get queued up until ListView is scrolledImageButton 点击​​事件排队,直到 ListView 滚动
【发布时间】: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 事件可以正常工作。所以它必须与我在这个活动上的设置有关。这是一些代码:

我自定义BaseAdaptergetView()

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


    【解决方案1】:

    ListView 存在干扰每个项目内视图的触摸事件的已知问题。您应该改用 RecyclerView。 ListView 基本上被视为已被 RecyclerView 取代的新应用程序弃用。

    【讨论】:

    • 我实际上能够通过简单地将焦点放在我的 SearchView 中的 EditText 上来完成这项工作。不知道为什么会这样,但确实如此。但你是对的,我可能应该使用 RecyclerView,而这是我最终计划实施的东西。感谢您的意见。
    • 我遇到了完全相同的问题和解决方法。在一个项目中,我最初使用 ListView,因为这是我所知道的,然后随着时间的推移,我发现有必要全押在 RecyclerView 上,因为我讨厌我所有的变通方法。我希望你能尽快转换!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多