【问题标题】:RecyclerView with items that hide/show their childsRecyclerView 带有隐藏/显示其子项的项目
【发布时间】:2016-04-11 00:37:23
【问题描述】:

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

我的问题是,如果我在 RecyclerView 中有 3 个项目(A、B 和 C),可见 TextViews 的数量相同,并且 A 在列表顶部,B 在中间,C在底部,例如,如果 B 必须显示比以前更多的 TextViews,则在短时间内,该项目 (B) 将与 C 重叠,因为它已经变大并且必须适应新可见的 TextViews之前的知名度已经消失。

问题的可视化表示:

期望的情况

当前和不希望的情况

稍后RecyclerView会正确容纳该项目。

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

编辑:

在其中一个 cmets 中建议我可能必须自己制作动画并转换视图。这是必要的还是有另一种方法?如果是这样,我如何为视图设置动画和转换?

编辑 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);
    }
}

【问题讨论】:

  • 尝试使用TextViews INVISIBLE 而不是GONE
  • 你能发布你的代码来显示发生了什么吗?如果数据发生变化,您应该能够简单地调用 recyclerView.getAdapter().notifyDataSetChanged();它应该正确重绘recyclerView。
  • @LNI 我正在这样做,但如前所述,问题在短时间内出现(我猜RecyclerView 更新时),然后它被正确呈现。
  • @sonictt1 这会在项目中留下“漏洞”,因为有些项目会有一些 TextViews 处于活动状态,而另一些则不会,因此对我来说会有不受欢迎的外观。
  • 你的问题不清楚。也许您可以发布一张图片,以便更好地说明您要描述的内容。

标签: android android-recyclerview


【解决方案1】:

关键是使用 RecyclerView.ViewHolder 类setIsRecyclable() 方法。将此属性设置为真为enter link description here

【讨论】:

    【解决方案2】:

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

    android:visibility="gone"
    

    检查条件时:

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

    你应该这样做:

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

    【讨论】:

    • 我正在按照您的建议进行操作。问题是,当可见性更改为VISIBLE 时,RecyclerView 会在短时间内显示具有新高度但与下面的项目重叠的项目。
    • 如果你删除数据绑定和所有这些东西,我的代码和你的完全一样
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果你还需要添加流畅的动画效果,试试这个吧。

      默认设置可见性 == 消失。

          @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 更改视图可见性的原因。

      【讨论】:

        【解决方案5】:

        使用 RecyclerView adpater 提供的notifyItemChanged(int position) 函数来通知项目已更改。

        【讨论】:

          猜你喜欢
          • 2020-09-24
          • 2020-06-04
          • 2021-10-02
          • 2017-05-01
          • 2021-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多