首页 > 解决方案 > 奇怪的行为 - 如果存在根布局,Recyclerview onItemClick 无法正常工作

问题描述

问题: 我有一个 recyclerview,在该 recyclerview 的适配器中,我只有RadioButton没有任何父布局,如LinearLayoutRelativeLayout。这次 onItemClick 工作正常。如果我要添加像LinearLayoutRelativeLayout这样的父布局,它不会调用 onItemClick。

我的代码如下所示。

FilterJobsCategoryAdapter.java

    public class FilterJobsCategoryAdapter
        extends
        RecyclerView.Adapter<RecyclerView.ViewHolder>
        implements
        APIServiceConstants {

    private int lastSelectedPosition = -1;

    private Context mContext;
    private List<String> mItem;
    private OnItemClickListener mOnItemClickListener;

    public FilterJobsCategoryAdapter(Context context, List<String> item) {
        this.mItem = item;
        this.mContext = context;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.rv_item_filter_jobs_category, parent, false);
        return new RecyclerViewHolders(layoutView);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {

        final RecyclerViewHolders viewHolder = (RecyclerViewHolders) holder;
        viewHolder.rb_filter_category.setText(mItem.get(position));

        if (lastSelectedPosition == -1 && position == 0) {

            viewHolder.rb_filter_category.setChecked(true);
            viewHolder.rb_filter_category.setClickable(false);
            viewHolder.rb_filter_category.setTextColor(mContext.getResources().getColor(R.color.colorPrimaryBlue));
            viewHolder.rb_filter_category.setBackgroundColor(mContext.getResources().getColor(R.color.colorPrimaryBlue));
            viewHolder.rb_filter_category.setTextColor(Color.WHITE);

        } else {

            if (lastSelectedPosition == position) {
                viewHolder.rb_filter_category.setChecked(true);
                viewHolder.rb_filter_category.setClickable(false);
                viewHolder.rb_filter_category.setTextColor(mContext.getResources()
                        .getColor(R.color.colorPrimaryBlue));
                viewHolder.rb_filter_category.setBackgroundColor(mContext.getResources().getColor(R.color.colorPrimaryBlue));
                viewHolder.rb_filter_category.setTextColor(Color.WHITE);

            } else {
                viewHolder.rb_filter_category.setChecked(false);
                viewHolder.rb_filter_category.setClickable(true);
                viewHolder.rb_filter_category.setTextColor(mContext.getResources().getColor(R.color.blackTextColor));
                viewHolder.rb_filter_category.setBackgroundColor(mContext.getResources()
                        .getColor(R.color.lightGreyBg80));
            }
        }
    }

    @Override
    public int getItemCount() {
        return mItem.size() > 0 ? mItem.size() : 0;
    }

    class RecyclerViewHolders extends RecyclerView.ViewHolder {

        @BindView(R.id.rb_filter_category)
        RadioButton rb_filter_category;

        RecyclerViewHolders(View view) {
            super(view);

            ButterKnife.bind(this, view);

            view.setOnClickListener(v -> {
                lastSelectedPosition = getAdapterPosition();
                mOnItemClickListener.onClick(lastSelectedPosition);
                notifyDataSetChanged();
            });
        }
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.mOnItemClickListener = onItemClickListener;
    }

    public interface OnItemClickListener {
        void onClick(int position);
    }
}

rv_item_filter_jobs_category.xml(onItemClick 不适用于此代码)

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <RadioButton
        android:id="@+id/rb_filter_category"
        style="@style/FilterCategoryRadioButtonStyle" />

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp1"
        android:background="@color/lightGreyBg80" />
</LinearLayout>

rv_item_filter_jobs_category.xml(onItemClick 适用于此代码)

    <?xml version="1.0" encoding="utf-8"?>
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rb_filter_category"
    style="@style/FilterCategoryRadioButtonStyle" />

样式.xml

<style name="FilterCategoryRadioButtonStyle" parent="@android:style/Widget.CompoundButton">
    <item name="android:fontFamily">@font/roboto_medium</item>
    <item name="android:gravity">start|center_vertical</item>
    <item name="android:maxLines">1</item>
    <item name="android:includeFontPadding">false</item>
    <item name="android:hint">@string/str_view_by</item>
    <item name="android:padding">@dimen/dp10</item>
    <item name="android:textSize">@dimen/sp12</item>
    <item name="android:ellipsize">end</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:textColor">@color/blackTextColor</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:button">@null</item>
</style>

我不明白这里发生了什么......这很奇怪!任何指导都将不胜感激。谢谢。

标签: androidandroid-layoutandroid-recyclerviewonitemclicklistenerandroid-radiobutton

解决方案


尝试clickableRadioButton. 由于您实际上是onClickListener在根视图上设置的,因此可能会RadioButton拦截触摸事件,因此它永远不会在根视图上调用。


推荐阅读