我有这样的代码
public static class MyViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.text)
TextView label;
public MyViewHolder(View itemView) {
super(itemView);
ButterKnife.inject(this, itemView);
}
public void hide(boolean hide) {
label.setVisibility(hide ? View.GONE : View.VISIBLE);
}
}
映射到RecyclerView
中的单行。 R.id.text
实际上是布局的根视图,它被夸大并传递给构造函数。
我正在使用LinearLayoutManager
的默认实现。
在bindViewHolder
中,我在hide(true)
的实例上调用MyViewHolder
,但不是按预期折叠行,而是行变为不可见,在{{中保持其高度和位置1}}。还有其他人遇到过这个问题吗?
如何隐藏RecyclerView中的项目?
答案 0 :(得分:35)
没有内置的方法来隐藏RV中的孩子,但当然如果它的高度变为0,它将无法看见:)。我假设您的根布局确实有一些最小高度(或精确高度),即使它已经消失,它仍然需要空间。
此外,如果要删除视图,请将其从适配器中删除,不要隐藏它。是否有理由要隐藏而不是删除?
答案 1 :(得分:31)
将方法setVisibility(boolean isVisible)
放入ViewHolder
。
您可以更改itemView
的{{1}}参数(宽度和高度):
LayoutManager
并更改public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
...
public void setVisibility(boolean isVisible){
RecyclerView.LayoutParams param = (RecyclerView.LayoutParams)itemView.getLayoutParams();
if (isVisible){
param.height = LinearLayout.LayoutParams.WRAP_CONTENT;
param.width = LinearLayout.LayoutParams.MATCH_PARENT;
itemView.setVisibility(View.VISIBLE);
}else{
itemView.setVisibility(View.GONE);
param.height = 0;
param.width = 0;
}
itemView.setLayoutParams(param);
}
public ViewHolder(View itemView) {
super(itemView);
...
}
}
(分隔符)的可见性:
ItemDecoration
答案 2 :(得分:10)
好吧,所以我最终做到这一点的方式是我拥有了我的整个数据集,比如myObjects
,我有一些场景我只想显示该数据集的子集。
由于设置RecyclerView
中行的可见性并不会导致高度崩溃,并且设置行的高度似乎也没有做任何事情,我所要做的就是保持次要名为myObjectsShown
的数据集只是List<Integer>
,它将索引到myObjects
以确定要显示的对象。
然后我会间歇性地更新myObjectsShown
以包含正确的索引。
因此,
public int getItemCount() {
return myObjectsShown.size();
}
和
public void onBindViewHolder(MyViewHolder holder, int position) {
Object myObject = myObjects.get(myObjectsShown.get(position));
// bind object to viewholder here...
}
答案 3 :(得分:10)
你可以做到!
首先,您需要检测要隐藏的项目的哪个位置。您可以自定义getItemViewType来执行此操作。
接下来,在onCreateViewHolder上,取决于视图类型。你可以这样做:
if(viewType == TYPE_HIDE) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty_item, parent, false);
vHolder = new ViewHolder(context, v, viewType, this);
break;
}
return vHolder;
- &GT;空项是没有任何内容的布局(换句话说,它是创建时的默认布局)。或代码:
<?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="match_parent"
android:orientation="vertical">
</LinearLayout>
希望有所帮助!
答案 4 :(得分:3)
为了隐藏RecyclerView中的视图,我隐藏/显示OnBindViewHolder
中的视图:
if (item.isShown) {
vh.FooterLayout.setVisibility(View.Visible);
} else {
vh.FooterLayout.setVisibility(View.Gone);
}
例如 - 从活动中我只需重新绘制所需的项目:
_postListAdapter.notifyItemChanged(position)
//如果您想显示/隐藏页脚 - 位置为amountOfPosts.size()
并且还更改bool变量 - amountOfPosts[amountOfPosts.size()].isShown
答案 5 :(得分:2)
为了完整起见,您应该注意,将视图可见性设置为GONE不会隐藏边距。你需要做这样的事情:
if(itemView.getVisibility() != GONE) itemView.setVisibility(GONE);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) itemView.getLayoutParams();
layoutParams.setMargins(0, 0, 0, 0);
itemView.setLayoutParams(layoutParams);