隐藏RecyclerView中的视图

时间:2014-12-19 22:29:19

标签: android

我有这样的代码

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中的项目?

6 个答案:

答案 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);