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
会在短时间内以新高度显示项目,但与下面的项目重叠。如果删除数据绑定和所有这些内容,我的代码与您的代码完全相同