【问题标题】:Discussion on RecyclerViews ability关于 RecyclerViews 能力的讨论
【发布时间】:2016-09-30 13:40:54
【问题描述】:

为了显示项目列表,我通常使用 RecyclerView,但我有一个要求,使我更容易使用垂直 LinearLayout。我不想失去 RecyclerView 良好的资源管理,所以我正在寻找不同的解决方案,希望有人可以帮助我。

我想到了一个布局,顶部有一些视图,然后是项目列表,底部有更多视图。或者包含多个 RecyclerView 的布局。所以你在顶部有一些视图,一个项目列表,然后是更多视图和另一个项目列表等。

我的布局可能如下所示:

  • 查看1
  • 查看2
  • 回收站视图
  • 查看3
  • 回收站视图
  • 查看4

通常,RecyclerView 就像一个可滚动的框架,您可以在其中滚动一些内容。这意味着如果你开始滚动,你的整个屏幕会卡在某个位置,你只是在 RecyclerView 中滚动直到它结束。然后你可以继续滚动整个屏幕。

我想要的是一个完全膨胀的 RecyclerView,因此您始终滚动整个屏幕,而不仅仅是 RecyclerView,但又不会失去 RecyclerView 的资源管理。

有人知道这个的解决方案吗?

【问题讨论】:

  • 你描述的设置当然是可以的,如果每个视图(包括RecyclerView)的高度都很短的话。

标签: android listview android-recyclerview android-adapter


【解决方案1】:

将以下代码添加到您的回收器视图的自定义适配器

  @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if (viewType == ITEM_TYPE_NORMAL) {
            View normalView = LayoutInflater.from(getContext()).inflate(R.layout.my_normal_row, null);
            return new MyNormalViewHolder(normalView); // view holder for normal items
        } else if (viewType == ITEM_TYPE_HEADER) {
            View headerRow = LayoutInflater.from(getContext()).inflate(R.layout.my_header_row, null);
            return new MyHeaderViewHolder(headerRow); // view holder for header items
        }
    }

我的建议是使用带有自定义适配器的单个 recyclerview,并使用 diff 布局为每一行 recyclerview 充气,即....根据您的情况

【讨论】:

    【解决方案2】:

    在这种情况下,我只使用一个RecycleView 来实现我自己的getItemViewType

    【讨论】:

      【解决方案3】:

      最佳答案取决于您希望整个屏幕的行为。

      “我想要的是一个完全膨胀的 RecyclerView,所以你总是滚动整个屏幕而不是仅仅滚动 RecyclerView,但又不会失去 RecyclerView 的资源管理。”

      这个要求让我认为最好的选择确实是使用不同 ViewHolder 类型的单个 RecyclerView,例如提到的@Rissmon Suresh 和 @betorcs。

      public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
      
      
      
              class HeaderViewHolder extends RecyclerView.ViewHolder {
                  ...
              }
      
      
              class NormalViewHolder1 extends RecyclerView.ViewHolder {
                  ...
              }
      
      
      
              @Override
              public int getItemViewType(int position) {
      
                  // use position to decide what kind of View you want
                  // can be fixed or you can access the data to check dinamically
      
                  if(position == 0)
                     return 0;
                  else
                     return 1;
              }
      
      
              @Override
              public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      
                   switch (viewType) {
                       case 0: return new HeaderViewHolder(...);
                       case 1: return new NormalViewHolder1(...);
                       //...
                   }
              }
          }
      

      希望这会有所帮助 =)

      【讨论】:

      • 您的问题解决了吗?让我知道这是否有帮助 =)
      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2015-08-09
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多