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

时间:2016-04-11 00:37:24

标签: android android-recyclerview recycler-adapter

我有一个RecyclerView,其中的项目是LinearLayout,其中有几个TextViews作为孩子。根据某些规则(这在onBindViewHolder中确定),TextViews可能会被隐藏(可见性GONE)或显示。

我的问题是,如果我在RecyclerView中有3个项目(A,B和C),且可见TextViews的数量相同且A位于列表顶部,则B in中间和C在底部,如果例如B必须比以前显示更多TextViews,在短暂的时间内该项目(B)将与C重叠,因为它已经增长并且必须容纳新的可见TextViews,之前的可见度为GONE。

问题的直观表示:

期望的情况

enter image description here

当前和不受欢迎的情况

enter image description here

稍后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);
    }
}

5 个答案:

答案 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)函数来通知某项已更改。