【问题标题】:Android - GridLayoutManager - Load items in list vertically?Android - GridLayoutManager - 垂直加载列表中的项目?
【发布时间】:2019-02-26 07:17:49
【问题描述】:

我有一个假设是 20 项的列表。我希望能够像这样加载它们

1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20

我正在使用 RecyclerViewGridLayoutManager 使用GridLayoutManager(context, 2),它加载项目如下

1 2
3 4
5 6
7 8
....

这不是我想要的输出

【问题讨论】:

  • 是的。你不能那样做。您必须手动排列/分配列表中的项目以获得输出

标签: android android-recyclerview grid-layout gridlayoutmanager


【解决方案1】:

实现这一点的最简单方法是根据所需的顺序对 ArrayList 进行排序,将你的 arraylist 传递给 rearrangeTheArrayList 函数获取新的 ArrayList 并将其传递给 recycler view Adapter 以实现上述订购。

 public ArrayList<Integer> rearrangeTheArrayList(ArrayList<Integer> integerArrayList) {
    ArrayList<Integer> resultArrayList = new ArrayList<>();
    int halfLength = 0;
    if (integerArrayList.size() % 2 == 1) {
        halfLength = (integerArrayList.size() / 2) + 1;
    } else {
        halfLength = integerArrayList.size() / 2;
    }

    for (int i = 0; i < halfLength; i++) {
        resultArrayList.add(integerArrayList.get(i));
        if ( (i + halfLength)<(integerArrayList.size() )) {
            resultArrayList.add(integerArrayList.get(i + halfLength));
        }
    }
    return resultArrayList;
}

【讨论】:

    【解决方案2】:

    GridLayoutManager 总是教RecyclerView 从左到右和从上到下绘制。此视图的原因的默认比例是垂直(或水平)。它无法计算在这种动态情况下应该显示多少行。我有一个解决方案给你。但是,您不应该保留此业务逻辑。

    您只需要一个具有两种视图类型和用于索引正确事物的简单逻辑的适配器。示例代码:

    public class SampleAdapter extends RecyclerView.Adapter<ViewHolder> {
        private final Context context;
        private List<Integer> listLeft;
        private List<Integer> listRight;
    
        public SampleAdapter (Context context) {
            this.context = context;
        }
    
        public void setListLeft(List<Integer> list) {
            this.listLeft = list;
        }
    
        public void setListRight(List<Integer> list) {
            this.listRight = list;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(context).inflate(R.layout.sample, parent, false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            int index = position / 2; // assumes there are two lists of equal lengths
            int viewType = getItemViewType(position);
            if (viewType == TYPE_1) {
                holder.textView.setText(listLeft.get(index).toString());
            } else if (viewType == TYPE_2) {
                holder.textView.setText(listRight.get(index).toString());
            }
        }
    
        @Override
        public int getItemCount() {
            return listLeft.size() + listRight.size();
        }
    
        @Override
        public int getItemViewType(int position) {
            return position % 2 == 0 ? VIEW_TYPE_1 : VIEW_TYPE_2;
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以实现这样的逻辑。它会顺利运行

      override fun onBindViewHolder(holder: RecyclerView.ViewHolder, pos: Int) {
                  var arraySize = 21
                  var half = 0
                  if (array % 2 == 0)
                      half = array % 2
                  else half = (array % 2 + 0.5).toInt()
                  if (pos  % 2 == 0)
                      print(pos)
                  else print(half + pos)
              }
      

      【讨论】:

        【解决方案4】:

        GridLayoutManager与LinearLayout不同,默认方向是VERTICAL,所以你应该设置HORIZONTAL,意思是如果空间不够,更多的项目会水平排列,像这样:

        recyclerView.setLayoutManager(new GridLayoutManager(activity, 2, GridLayoutManager.HORIZONTAL, false));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-14
          • 2016-12-02
          • 1970-01-01
          • 2018-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多