recyclerview 中的可见性仍然占据空间?

nan*_*i10 5 android android-recyclerview

这是我当前的代码。我想隐藏我的特定项目,recyclerview但当我使用时visibility.gone仍然占用回收视图上的空间。我还尝试了所有可能的解决方案如何在特定条件下从回收站视图中隐藏项目?任何帮助

  for(int j =0; j < minusList.size(); j++){
      int availableRooms =  minusList.get(j);

      if(norooms > availableRooms){ //norooms is the number of rooms wanted
      holder.itemView.setVisibility(View.GONE);
      mAdapter.notifyItemRemoved(position);
     }else{
      holder.rRoomsLeft.setText("Room available");
     }

}
Run Code Online (Sandbox Code Playgroud)

这是我的 XML

<android.support.v7.widget.RecyclerView
                android:id="@+id/listView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusable="false"
                android:focusableInTouchMode="false" />
Run Code Online (Sandbox Code Playgroud)

Bru*_*Lin 9

1.为什么会发生这种情况?

\n

holder.itemView.setVisibility(View.GONE);这在 RecyclerView 中不起作用。

\n

itemView是 RecyclerView 中的子视图。与其他 ViewGroup(FrameLayout 等)不同,RecyclerView 在布局过程中忽略子视图的可见性。

\n

2.如何解决?

\n

选项1 使用常规视图组(例如 FrameLayout)来包装您的真实布局,并隐藏您的真实布局:findViewById(R.id.layout_to_hide).setVisibility(View.GONE)

\n
<FrameLayout android:layout_width="match_parent"\n    android:layout_height="wrap_content">\n\n    <LinearLayout android:id="@+id/layout_to_hide"\n                  android:layout_width="match_parent"\n                  android:layout_height="wrap_content">\n         //Put here your views\n    </LinearLayout>\n</FrameLayout>\n
Run Code Online (Sandbox Code Playgroud)\n

选项2将itemView\xe2\x80\x99s 高度更改为0,这样我们就看不到它

\n
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));\n
Run Code Online (Sandbox Code Playgroud)\n

选项3 如果此项不应该出现在列表中,则只需不要将其放入适配器数据中,或者将其删除。

\n

3.了解更多

\n

1. 为什么其他视图组(例如 FrameLayout)可以很好地满足儿童的可见性?

\n

如果子项消失了,他们不会计算子项的布局参数

\n

在此输入图像描述

\n

在此输入图像描述

\n

在此输入图像描述

\n

2. 为什么RecyclerView没有?

\n

如果子视图已经消失,RecyclerView 仍然会计算子视图的布局参数,因此它仍然占用空间。

\n

回收者视图

\n


Sha*_*rge 0

请试试这个

    for(int j =0; j < minusList.size(); j++){

      int availableRooms =  minusList.get(j);

      if(norooms > availableRooms){        //norooms is the number of rooms wanted
        holder.itemView.setVisibility(View.GONE);
        mAdapter.notifyItemRemoved(position); 
     }else{
         holder.itemView.setVisibility(View.VISIBLE);
         holder.rRoomsLeft.setText("Room available");
     }
}
Run Code Online (Sandbox Code Playgroud)