2016-04-11 47 views
2

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

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

问题的

可视化表示:

理想状况

enter image description here

当前的和不需要的情况

enter image description here

RecyclerView有点容易正确地容纳物品。

我该如何避免发生这种情况?

编辑:

在评论的一个建议,我可能有动画和转换的观点我自己。这是必要的还是有另一种方式呢?如果是这样,我该如何动画和转换观点?

编辑2:

试过这样的回答:Animating items,但问题仍然存在。有一个可见的延迟,直到RecyclerView更新。

EDIT 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

试着让'TextViews'' INVISIBLE'而不是'GONE'。 – sonictt1

+0

你可以发布你的代码显示发生了什么?如果数据发生变化,您应该能够简单地调用recyclerView.getAdapter()。notifyDataSetChanged();并且它应该正确重绘recyclerView。 – LNI

+0

@LNI我这样做,但如上所述,问题出现在短时间内(我猜'RecyclerView'更新),然后它正确呈现。 – OneEyeQuestion

回答

0

这样您的问题是:在你的XML(项目视图),可以声明TextView的默认属性:

android:visibility="gone" 

时检查条件:

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

取而代之,你应该这样做:

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

我正在做你的建议。问题在于,当可见性更改为“可见”时,“RecyclerView”会在短时间内显示具有新高度的项目,但与下面的项目重叠。 – OneEyeQuestion

+0

你可以显示你的代码吗? –

+0

如果您删除数据绑定和所有内容,我的代码与您的代码完全相同 – OneEyeQuestion

0

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

0

如果您还需要添加流畅的动画效果,请尝试这一个。

默认情况下,把可见性==走了。

@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" 

父布局。

注意 - 在可见性情况下==可见,动画布局更改工作正常,平稳,但在可见性情况下== GONE项目重叠彼此这就是为什么我使用notifyItemChanged来改变视图的可见性。

相关问题