Recyclerview GridLayoutManger - 如何更改项目的顺序?显示彼此相邻的两个列表

Recyclerview GridLayoutManger - how to change order of items? Displaying two lists next to each other

基本上我有 2 个列表,1 到 10,我想在 recyclerview 中一个一个地显示它们,像这样:

1  1
2  2
3  3
.  .
.  .
10 10

我试过的是有 2 列的 GridLayoutManager,但我得到的是:

您可以看到它从左到右填充网格,但我希望它从上到下填充,当它到达新列表时,将其显示在第二列中。

有什么建议吗?

我正在使用 recyclerviewMergeAdapter,因为我认为这是一个很好的方法。如果在这种情况下有更好的解决方案,请告诉我。

private final PolazakAdapterRv adapter1;
private final PolazakAdapterRv adapter2;
private final RecyclerViewMergeAdapter mergeAdapter;

@BindView(R.id.recyclerViewWorkDays)
RecyclerView recyclerView;


public DaysFragmentView(Context context) {
    super(context);
    inflate(getContext(), R.layout.fragment_work_days, this);
    ButterKnife.bind(this);

    mergeAdapter = new RecyclerViewMergeAdapter();

    adapter1 = new PolazakAdapterRv(getContext());
    adapter2 = new PolazakAdapterRv(getContext());

    mergeAdapter.addAdapter(adapter1);
    mergeAdapter.addAdapter(adapter2);

    recyclerView.setAdapter(mergeAdapter);
    GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
    recyclerView.setLayoutManager(gridLayoutManager);
}


public void setRecyclerViewAdapter(List<Integer>[] lists) {
    List<Integer> list1 = lists[0];
    List<Integer> list2 = lists[1];

    adapter1.setMap(list1);
    adapter2.setMap(list2);

    mergeAdapter.notifyDataSetChanged();
    Timber.d("RecyclerView updated!");
}


PolazakAdapterRv:

public class PolazakAdapterRv extends RecyclerView.Adapter<PolazakHolder> {

private final Context context;
private List<Integer> list;

public PolazakAdapterRv(Context context) {
    this.context = context;
    this.list = new ArrayList<>();
}


public void setMap(List<Integer> list) {
    this.list = list;
}

@Override
public PolazakHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context)
            .inflate(R.layout.rv_polazak, parent, false);
    return new PolazakHolder(view);
}

@Override
public void onBindViewHolder(PolazakHolder holder, int position) {
    holder.textViewPolazakHour.setText(list.get(position).toString());
}

@Override
public int getItemCount() {
    return list.size();
}

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

public class PolazakAdapterRv extends RecyclerView.Adapter<PolazakHolder> {
private final Context context;
private List<Integer> list1;
private List<Integer> list2;

public PolazakAdapterRv(Context context) {
    this.context = context;
}

public void setList1(List<Integer> list) {
    this.list1 = list;
}

public void setList2(List<Integer> list) {
    this.list2 = list;
}

@Override
public PolazakHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context)
            .inflate(R.layout.rv_polazak, parent, false);
    return new PolazakHolder(view);
}

@Override
public void onBindViewHolder(PolazakHolder holder, int position) {
    int index = position / 2; // assumes there are two lists of equal lengths
    int viewType = getItemViewType(position);
    if (viewType == TYPE_1) {
        holder.textViewPolazakHour
        .setText(list1.get(index).toString());
    }
    else if (viewType == TYPE_2) {
        holder.textViewPolazakHour
        .setText(list2.get(index).toString());
    }
}

@Override
public int getItemCount() {
    return list1.size() + list2.size();
}

@Override
public int getItemViewType(int position) {
    return position % 2 == 0 ? VIEW_TYPE_1 : VIEW_TYPE_2;
}

分解:

一个适配器具有您要显示的两个列表,因此它们一起滚动。

您有两种描述每个列表的视图类型。

由于您希望两列分别显示每个列表,从逻辑上讲,这仅意味着您交替显示每个单元格中的内容。所以当位置是偶数时(左列)你 return VIEW_TYPE_1。当位置偶数时(右栏)你 return VIEW_TYPE_2.

适配器中的总计数就是两个列表的总计数。

视图布局相同(我猜)所以您可以使用相同的 onCreateViewHolder

最后,绑定viewholder时,您只需要根据索引知道您正在使用的视图类型以及要使用的模型对象。因此,只需询问您的 getViewType 方法以获取正确的视图类型以了解要使用哪个列表,然后将位置除以 2 即可将正确的索引放入列表中。无论位置是偶数还是奇数,整数除法都会在给定列表中产生正确的索引。

希望对您有所帮助!