这是我当前的代码。我想在我的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" />
6条答案
按热度按时间l3zydbqr1#
而不是使用
holder.itemView.setVisibility(View.GONE);
,使用这个: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)
Option2将itemView的heigh更改为0,这样我们就看不到它
Option3如果此项目不应该在List中,则简单地不要让它在适配器数据中,或将其删除。
3.了解详情
1.为什么FrameLayout等其他视图组对儿童可见性也很好?
如果子对象已消失,它们不会计算子对象的布局参数
2.为什么RecyclerView没有?
RecyclerView仍然计算子元素的布局参数,如果它是GONE,所以它仍然占用空间。
vxbzzdmp3#
请试试这个
bsxbgnwa4#
我猜你说“占用空间”是因为行在那里,但没有显示“房间可用”。
从RecyclerView中删除一行的方法是先从下划线列表中删除它,然后调用notifyItemRemoved或notifyDatasetChanged,而不是隐藏行的视图。
在您的情况下,您需要首先从minusList中删除项目,然后调用notifyItemRemoved,否则如果getItemCount()仍然返回minusList.size,RecyclerView仍然认为行在那里,即使它不可见。
g9icjywg5#
yx2lnoni6#
在某些情况下,仅更改可见性属性可能仍然会分配空白空间(因为父视图的填充,边距,内部元素等)。然后更改父视图的高度有助于:
然后确保在它应该可见的条件下,还设置:
你需要这样做,因为viewHolder在你滚动时会被回收,如果你这样改变属性,并且永远不会将它们返回到自然状态,那么其他元素在重用相同视图的情况下就会被隐藏。