我有一个RecyclerView
,其中的项目是LinearLayout
,其中有几个TextViews
作为孩子。根据某些规则(这在onBindViewHolder
中确定),TextViews
可能会被隐藏(可见性GONE)或显示。
我的问题是,如果我在RecyclerView
中有3个项目(A,B和C),且可见TextViews
的数量相同且A位于列表顶部,则B in中间和C在底部,如果例如B必须比以前显示更多TextViews
,在短暂的时间内该项目(B)将与C重叠,因为它已经增长并且必须容纳新的可见TextViews
,之前的可见度为GONE。
问题的直观表示:
期望的情况
当前和不受欢迎的情况
稍后RecyclerView
正确容纳该项目。
如何避免这种情况发生?
编辑:
其中一条评论建议我可能需要自己制作动画并转换视图。这有必要还是有另一种方式吗?如果是这样,我如何动画和转换视图?
编辑2:
尝试了这个答案:Animating items,但问题仍然存在。在RecyclerView
更新之前有明显的延迟。
编辑3:
我使用此类(RecyclerViewCursorAdapter)作为填充RecyclerView
的适配器的基础。另外,我在onResume
@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);
}
}
答案 0 :(得分:0)
您的问题在于:在xml(项目视图)中,使用默认属性声明textView:
android:visibility="gone"
检查条件时:
if (condition) {
textView.setVisibility(View.VISIBLE);
}
而不是那样,你应该这样做:
if (condition) {
textView.setVisibility(View.VISIBLE);
} else {
textView.setVisibility(View.GONE);
}
答案 1 :(得分:0)
如果它的高度变为0,它将无法显示:)。我假设您的根布局确实有一些最小高度(或精确高度),即使它已经消失,它仍然需要空间。
答案 2 :(得分:0)
如果您还需要添加平滑的动画效果,请试试这个。
默认情况下,将visibility ==消失。
@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"
用于父布局。
注意 - 如果可见性== VISIBLE,动画布局更改工作正常且流畅但在可见性== GONE项目彼此重叠的情况下这就是为什么我使用notifyItemChanged更改视图的可见性。
答案 3 :(得分:0)
关键是使用 RecyclerView.ViewHolder类的 setIsRecyclable()方法。将此属性设置为enter link description here
答案 4 :(得分:0)
使用RecyclerView adpater提供的notifyItemChanged(int position)
函数来通知某项已更改。