Android 包含隐藏/显示其孩子的项目的RecyclerView

Android 包含隐藏/显示其孩子的项目的RecyclerView,android,android-recyclerview,Android,Android Recyclerview,我有一个回收视图,其中的项目是一个线性布局,有几个文本视图。根据某些规则(这在onBindViewHolder中确定),textview可能隐藏(可见性消失)或显示 我的问题是,如果我在代码中使用了3个项目(A,B和C),在同一数量的可见代码>文本视图< /代码>中,A在列表的顶部,B在中间,C在底部,如果B必须比以前显示更多的文本视图< /代码>,在短时间内,这个项目(b)将与C重叠,因为它的大小已经增加,并且必须适应新的可见TextViews,这是以前可见性消失时的情况 问题的可视化表示:

我有一个
回收视图
,其中的项目是一个
线性布局
,有几个
文本视图
。根据某些规则(这在
onBindViewHolder
中确定),
textview
可能隐藏(可见性消失)或显示

我的问题是,如果我在代码中使用了3个项目(A,B和C),在同一数量的可见代码>文本视图< /代码>中,A在列表的顶部,B在中间,C在底部,如果B必须比以前显示更多的<代码>文本视图< /代码>,在短时间内,这个项目(b)将与C重叠,因为它的大小已经增加,并且必须适应新的可见
TextViews
,这是以前可见性消失时的情况

问题的可视化表示:

所需情况

当前和意外情况

经过一段时间后,
RecyclerView
可以正确容纳物品

我怎样才能避免这种情况发生

编辑:

在其中一条评论中,有人建议我可能需要自己制作动画并变换视图。这是必要的还是有别的方法?如果是,如何设置视图的动画和变换视图

编辑2:

尝试了以下答案:,但问题仍然存在。在
RecyclerView
更新之前,存在明显的延迟

编辑3:

我使用这个类()作为填充
RecyclerView
的适配器的基础。另外,我是在简历中做这件事的

@Override
public void onResume()
{
    super.onResume();

    if(getActivity().getSupportLoaderManager().getLoader(R.id.myLoaderId) == null)
    {
        getActivity().getSupportLoaderManager().initLoader(R.id.myLoaderId, null, this);
    }
    else
    {
        getActivity().getSupportLoaderManager().restartLoader(R.id.myLoaderId, null, this);
    }
}

您的问题是:在xml(项目视图)中,您使用默认属性声明textView:

android:visibility="gone"
检查条件时:

if (condition) {
    textView.setVisibility(View.VISIBLE);
}
相反,您应该这样做:

if (condition) {
    textView.setVisibility(View.VISIBLE);
} else {
    textView.setVisibility(View.GONE);
}

如果其高度变为0,则不可见:)。我假设您的根布局确实有一些最小高度(或精确高度),即使它已消失,它仍会占用空间。

如果您还需要添加平滑动画效果,请尝试此方法

默认情况下,put visibility==gone

    @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
    super.onBindViewHolder(holder, position);

    holderG.layoutReply.setVisibility(View.GONE);
}
并设置可见性,例如:

 holder.button.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view)
                {
                        if (holderG.layoutReply.getVisibility() == View.VISIBLE) {                   
                            notifyItemChanged(holderG.getAdapterPosition());
                        }
                        else {holderG.layoutReply.setVisibility(View.VISIBLE);
                        }
                    }
                }
            });
在你的充气机布局中

android:animateLayoutChanges="true"
用于父布局


注意--在可见性==可见的情况下,动画布局更改效果良好且平滑,但在可见性==消失的项目彼此重叠的情况下,这就是为什么我使用notifyItemChanged来更改视图的可见性

该键使用了RecyclerView.ViewHolder类的setIsRecyclable()方法。将此属性设置为true,因为使用RecyclerView Adpeter提供的
notifyItemChanged(int position)
功能通知项目已更改。

尝试将
文本视图
设置为不可见
而不是
不可见
您能发布代码来显示发生了什么吗?如果数据发生更改,您应该能够简单地调用recyclerView.getAdapter().notifyDataSetChanged();而且它应该正确地重新绘制recyclerView。@LNI我正在这样做,但正如所述,问题是在很短的时间内出现的(我猜当
recyclerView
更新时),然后它被正确地渲染。@sonictt1会在项目中留下“洞”,而且,由于一些项目将有一些
文本视图处于活动状态,而其他项目则没有,因此对我来说,它将有一个不希望出现的外观。您的问题不清楚。也许你可以发布一张图片,以便更好地说明你想要描述的内容。我正在按照你的建议做。问题是,当可见性更改为
VISIBLE
时,
RecyclerView
会在短时间内以新高度显示项目,但与下面的项目重叠。如果删除数据绑定和所有这些内容,我的代码与您的代码完全相同