android recyclerview中的可见性消失了,仍然占据空间?

wn9m85ua  于 2023-04-18  发布在  Android
关注(0)|答案(6)|浏览(171)

这是我当前的代码。我想在我的recyclerview上隐藏一个特定的项目,但当我使用visibility.gone时,仍然占用回收视图上的空间。我也尝试了所有可能的解决方案How to hide an item from Recycler View on a particular condition?任何帮助

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");
     }

}

这是我的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" />
l3zydbqr

l3zydbqr1#

而不是使用holder.itemView.setVisibility(View.GONE);,使用这个:

ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
  params.height = 0;
  holder.itemView.setLayoutParams(params);
7z5jn7bk

7z5jn7bk2#

1.为什么会这样?

holder.itemView.setVisibility(View.GONE);这在RecyclerView中不起作用。
itemView是RecyclerView中的子视图。与其他ViewGroup(FrameLayout等)不同,RecyclerView在布局过程中忽略子视图的可见性。

2.如何解决?

Option1使用FrameLayout等常规视图组 Package 真实的布局,隐藏真实布局:findViewById(R.id.layout_to_hide).setVisibility(View.GONE)

<FrameLayout android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout android:id="@+id/layout_to_hide"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content">
         //Put here your views
    </LinearLayout>
</FrameLayout>

Option2将itemView的heigh更改为0,这样我们就看不到它

holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));

Option3如果此项目不应该在List中,则简单地不要让它在适配器数据中,或将其删除。

3.了解详情

1.为什么FrameLayout等其他视图组对儿童可见性也很好?

如果子对象已消失,它们不会计算子对象的布局参数

2.为什么RecyclerView没有?

RecyclerView仍然计算子元素的布局参数,如果它是GONE,所以它仍然占用空间。

vxbzzdmp

vxbzzdmp3#

请试试这个

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");
     }
}
bsxbgnwa

bsxbgnwa4#

我猜你说“占用空间”是因为行在那里,但没有显示“房间可用”。
从RecyclerView中删除一行的方法是先从下划线列表中删除它,然后调用notifyItemRemoved或notifyDatasetChanged,而不是隐藏行的视图。
在您的情况下,您需要首先从minusList中删除项目,然后调用notifyItemRemoved,否则如果getItemCount()仍然返回minusList.size,RecyclerView仍然认为行在那里,即使它不可见。

g9icjywg

g9icjywg5#

ViewGroup.LayoutParams params = chatsViewHolder.itemView.getLayoutParams();
params.height = 0;
chatsViewHolder.itemView.setLayoutParams(params);
yx2lnoni

yx2lnoni6#

在某些情况下,仅更改可见性属性可能仍然会分配空白空间(因为父视图的填充,边距,内部元素等)。然后更改父视图的高度有助于:

holder.itemView.setVisibility(View.GONE); 
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));

然后确保在它应该可见的条件下,还设置:

holder.itemView.setVisibility(View.VISIBLE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

你需要这样做,因为viewHolder在你滚动时会被回收,如果你这样改变属性,并且永远不会将它们返回到自然状态,那么其他元素在重用相同视图的情况下就会被隐藏。

相关问题