【问题标题】:Android Recycleview- Show first item at bottom and scroll it from bottom to top for next itemsAndroid Recyclerview-在底部显示第一个项目并从下到上滚动以查看下一个项目
【发布时间】:2017-09-16 18:11:16
【问题描述】:

我有几个项目的回收站视图。我需要从底部开始显示项目,即第一个项目应显示在底部,从下到上滚动后,将显示更多项目。 为此,我尝试的是,

linearlayoutManager.setStackFromEnd(true);

这有助于从底部开始项目。但是,当有多个项目,超过同时适合屏幕的大小时,随着项目数量的增加,第一个项目会移动到顶部。

我也试过

linearlayoutManager.scrollToPosition(0);

这并没有改变任何东西。

这是一张显示我正在寻找的图片。

上面的列表中还有一些项目仍然不可见。

这里的外观当这些项目滚动时, .

我在图像中检查了这个视图的视图层次结构,它只显示了一个 recyclerview 和其中的项目。并且recyclerview的高度是match_parent,即没有项目的顶部空间显示recyclerview下方的另一个视图,这是一个谷歌地图。 我只需要知道如何在不使用更多额外视图的情况下实现 recyclerview 的这一功能。

任何帮助将不胜感激..!!

【问题讨论】:

  • 问题解决了吗?如果是,请发布解决方案,以便它可以帮助其他开发人员寻找解决方案。

标签: android scroll android-recyclerview material-design


【解决方案1】:

在 xml 中写入这一行以从底部开始列表

 android:stackFromBottom="true"

 <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:stackFromBottom="true">

    </android.support.v7.widget.RecyclerView>

第二件事是在添加适配器之前反转你的数组列表

【讨论】:

  • 谢谢 Hitesh。它是 stackFromEnd 用于从底部添加项目以用于 recyclerview 布局管理器。我已经尝试过,并且还用于反转数组列表,但无论如何列表项已填满并且项目显示为全屏。
【解决方案2】:

尝试使用相反的LinearLayoutManager

LinearLayoutManager linearlayoutManager = new LinearLayoutManager(context, VERTICAL, true);

【讨论】:

    【解决方案3】:

    尝试按如下方式初始化您的线性布局

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, true);
    

    third boolean 表示它是否应该反转项目。 但请记住,您的数据也应该从最新到最旧进行排序。

    【讨论】:

    • 感谢您的回复。我试过你的代码行。但这并不符合我的预期。一旦启动,我首先需要在底部获取第一个项目,然后它应该滚动到顶部以获取下一个项目。
    • “滚动到顶部查看下一项”是什么意思?
    • 请浏览我在问题中发布的两张图片。第一张图片显示了 recyclerview 的初始状态,仅显示了许多项目中的 1-2 个。在将这些项目拖动/滚动到顶部后,它会显示列表中的更多项目。
    【解决方案4】:

    将这些属性添加到您的 recyclerview (XML)

    android:paddingTop="500dp"          
    android:clipToPadding="false"
    

    你也可以在代码中这样设置:

    recyclerView.setPadding(0, 500, 0, 0);
    recyclerView.setClipToPadding(false);
    

    这适用于不同的屏幕尺寸

    int height = recyclerView.getHeight()
    recyclerView.setPadding(0, height - 200, 0, 0);
    recyclerView.setClipToPadding(false);
    

    如果你不知道如何获取屏幕宽度、高度以及如何将 dp 转换为 px

    这里是链接:How to get screen width and heightConverting pixels to dp

    【讨论】:

      【解决方案5】:

      似乎您想要的是在您的回收器适配器中有一个单独的视图类型,它不显示任何内容,而是地图的高度。这将允许您从列表开始的底部“向上滚动”并继续查看不同的视图。

      一个简单的例子:

      public class ScreenBottomRecyclerAdapter extends RecyclerView.Adapter {
          final int VIEW_TYPE_MAP = 0;
          final int VIEW_TYPE_ROW = 1;
      
          @Override
          public int getItemCount() {
              return dataset.length + 1;
          }
      
          @Override
          public int getItemViewType(int position) {
              if (position == 0) {
                  return VIEW_TYPE_MAP;
              } else {
                  return VIEW_TYPE_ROW;
              }
          }
      
          @Override
          public RecyclerView.ViewHolder createViewHolder(ViewGroup parent, int viewType) {
              switch (viewType) {
                  case VIEW_TYPE_MAP: return new ViewHolder(null); // This is an empty recycler row so you can see and interact with the map, it will need to be the height of the map so you'll probably want to make a new view type that the same height but doesn't show anything and doesn't intercept touches
                  case VIEW_TYPE_ROW: return new RowViewHolder(someInflatedView); // This will be the rows you are already creating
              }
          }
      
          @Override
          public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
              switch (getItemViewType(position)) {
                  case VIEW_TYPE_ROW: holder.update(position - 1) // Do your normal update here, but remember that your data will be off by 1 for the map view row in the recycler
              }
          }
      }
      

      【讨论】:

        【解决方案6】:
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true);
        linearLayoutManager.setStackFromEnd(true);
        linearLayoutManager.setReverseLayout(true);
        

        然后一旦你的数据被填充

        adapter.notifyDataSetChanged();
        recyclerView.post(new Runnable() {
        @Override
        public void run() {
           recyclerView.smoothScrollToPosition(0);
            }
        });
        

        【讨论】:

          【解决方案7】:

          使用以下代码反转列表:

          LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false);
          

          重要提示:将具有反向布局属性的布局管理器设置为true

          layoutManager.setReverseLayout(true);
          
          RecyclerView.setLayoutManager(layoutManager);
          

          此代码将显示您可能已分配给 RecyclerView 的反向列表

          【讨论】:

            猜你喜欢
            • 2023-03-07
            • 1970-01-01
            • 2022-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多