基本上我有 2 个列表,1 到 10,我想在 recyclerview 中一个一个地显示它们,像这样:
1 1
2 2
3 3
. .
. .
10 10
我尝试过的是有 2 列的 GridLayoutManager,但我得到的是:
您可以看到它从左到右填充网格,但我希望它从上到下填充,当它到达新列表时,将其显示在第 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/