gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:16:10 33 4
gpt4 key购买 nike

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

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

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

image

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

有什么建议吗?

我正在使用 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();
}

最佳答案

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

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;
}

分解:

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

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

由于您希望两列分别显示每个列表,从逻辑上讲,这仅意味着您可以交替显示每个单元格中的内容。因此,当位置为偶数时(左列),您将返回 VIEW_TYPE_1。当位置偶数时(右列),您返回 VIEW_TYPE_2。

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

View 布局相同(我猜),因此您可以使用相同的 onCreateViewHolder

最后,在绑定(bind) View 持有者时,您只需要根据索引知道您正在使用的 View 类型以及要使用的模型对象。因此,只需向您的 getViewType 方法询问正确的 View 类型即可知道要使用哪个列表,然后简单地将位置除以 2 以获得列表中的正确索引。无论位置是偶数还是奇数,整数除法都会在给定列表中产生正确的索引。

希望对您有所帮助!

关于android - Recyclerview GridLayoutManager - 如何更改项目的顺序?显示彼此相邻的两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47249881/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com