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

标签 android listview android-recyclerview gridlayoutmanager

基本上我有 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/

相关文章:

android - ListView 内的 PanGestureRecognizer (Xamarin.Forms)

java - 按字母顺序更新 RecyclerView 项目

android - 修改 Android list 文件后,项目从 Android 列表中消失

java - Android Studio Firebase Recyclerview升级错误

android - 像 gmail Android 一样更改工具栏?

android - Flutter:未找到 MediaQuery 小部件祖先

android - 迁移到 androidx 后膨胀类 android.support.design.widget.CoordinatorLayout 时出错

android - SQLite 异常 : Can't upgrade read-only database from version 1 to 2

android - 在 Layer-List 中使用 XML 更改布局的边距

android - BaseAdapter 和 ArrayAdapter 有什么区别?