BUG recyclerview 中的某些行在平板电脑的视图寻呼机内不可点击

Posted

技术标签:

【中文标题】BUG recyclerview 中的某些行在平板电脑的视图寻呼机内不可点击【英文标题】:BUG Some row in recyclerview not clickable inside view pager in tablet 【发布时间】:2022-01-11 11:01:54 【问题描述】:

我有一个带有视图寻呼机的布局,由 2 个带有回收器视图的片段组成

前四行是可点击的,但另一行不可点击,这是在平板电脑模式下发生的。 在电话模式下,一切正常。

奇怪的是,如果数据很短(只有 1 个字母),一切都可以点击,但数据很长(超过 3 个字母),那么从第 4 行开始就无法点击。FAB 按钮正在工作。我已经尝试过使用物理平板电脑和模拟平板电脑。

我正在使用 View Pager 2

这是一个错误吗?以及如何解决这个问题?

已编辑,我的 RecyclerView 适配器代码

private List<Craft> craftList;
private RecyclerViewClickListener clickListener;
private Context mContext;
public int selectedItem = -1;

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener 
    public TextView name ;
    public View container;
    private RecyclerViewClickListener mListener;

    public MyViewHolder(View view, RecyclerViewClickListener listener) 
        super(view);
        mListener = listener;
        name = (TextView) view.findViewById(R.id.name);
        container = view.findViewById(R.id.container);

        container.setOnClickListener(this);
    

    @Override
    public void onClick(View v) 
        selectedItem = getBindingAdapterPosition();
        if(selectedItem!= RecyclerView.NO_POSITION)
            mListener.OnButtonClick(v, getBindingAdapterPosition());
            notifyDataSetChanged();
        
    


public interface RecyclerViewClickListener 
    void OnButtonClick(View view, int position);


public CraftAdapter(List<Craft> craftList, RecyclerViewClickListener listener) 
    this.craftList = craftList;
    clickListener = listener;


@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.craft_item, parent, false);
    mContext = parent.getContext();
    return new MyViewHolder(itemView,clickListener);


@Override
public void onBindViewHolder(MyViewHolder holder, int position) 
    Craft craft = craftList.get(position);
    holder.name.setText(craft.getName());
    if(mContext.getResources().getBoolean(R.bool.is_tablet))
        if(selectedItem == position)
            holder.container.setBackgroundResource(R.color.light_blue);
        
        else
            holder.container.setBackgroundResource(R.color.white);
        
    


@Override
public int getItemCount() 
    return craftList.size();

【问题讨论】:

“新”部分是否也会发生这种情况? @Arthurghev “新”部分是什么意思?它总是发生在平板电脑(物理和模拟)上,但在手机上它工作正常。但是在手机上,当时只有1个片段,左右片段会一一显示(列表和详细信息) @SusiS 你能分享你的回收站视图适配器代码吗? @LucaPizzini 当然,我将其添加到我的问题中 @SusiS 在图片中有 2 个部分“新”和“旧”,这是否也发生在“新”部分? 【参考方案1】:

浪费了这么多时间。我终于找到了根本原因。

原因是使用LinearLayoutweight 的布局。 weight 使它无法正常工作,我认为这是一个错误。但我可以使用constraintlayout解决它

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@color/white"
    android:id="@+id/coordinator_layout">


    <LinearLayout
        android:orientation="horizontal"
        android:layout_
        android:layout_>
        <fragment android:name="CraftFragment"
            android:id="@+id/list_fragment"
            android:layout_weight="2" -->>This is the root cause
            android:layout_ -->> This is the root cause
            android:layout_
            />
        <View
            android:layout_
            android:layout_
            android:background="@color/dark_grey2"/>
        <FrameLayout
            android:id="@+id/detail_fragment"
            android:layout_weight="3"
            android:layout_
            android:layout_ />

    </LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

所以我把它改成:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@color/white"
    android:id="@+id/coordinator_layout">

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_
    android:layout_>
    <fragment android:name="CraftFragment"
        android:id="@+id/list_fragment"
        android:layout_weight="2"
        android:layout_
        android:layout_
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/detail_fragment"
        app:layout_constraintHorizontal_weight="2"/>



    <FrameLayout
        android:id="@+id/detail_fragment"
        android:layout_weight="3"
        android:layout_
        android:layout_
        app:layout_constraintLeft_toRightOf="@+id/list_fragment"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintHorizontal_weight="3"/>

    <View
        android:id="@+id/divider"
        android:layout_
        android:layout_
        android:background="@color/dark_grey2"
        app:layout_constraintLeft_toRightOf="@id/list_fragment"
        app:layout_constraintRight_toRightOf="@id/list_fragment"/>
</androidx.constraintlayout.widget.ConstraintLayout>

【讨论】:

以上是关于BUG recyclerview 中的某些行在平板电脑的视图寻呼机内不可点击的主要内容,如果未能解决你的问题,请参考以下文章

感悟一次不太好的寻找bug的体验,RecyclerView

避免个别行在 Pig 中的 ToDate 中出现异常

如何检查熊猫数据框行在各个列中是不是具有某些值,可扩展性

如何根据特定条件在 RecyclerView 上为某些项目隐藏 ImageView?

RecyclerView 移除动画bug

艺术控件RecyclerView的分隔线&bug解决