Recyclerview GridLayoutManger - 如何更改商品的订单?显示彼此相邻的两个列表

时间:2017-11-12 14:19:32

标签: android listview android-recyclerview gridlayoutmanager

基本上我有2个列表,1到10,我想在recyclerview中一个接一个地显示它们,如下所示:

mobilenumber: dialcode.val() + mobile.val(),

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

image

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

任何建议我怎么能这样做?

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

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


PolazakAdapterRv:

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!");
}

1 个答案:

答案 0 :(得分:0)

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

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_TYPE_1。当位置为偶数(右列)时,返回VIEW_TYPE_2。

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

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

最后,绑定视图时,您只需要根据索引以及要使用的模型对象知道您正在使用哪种视图类型。因此,只需询问您的getViewType方法以获取正确的视图类型,以了解要使用的列表,并将右侧索引的位置除以2。无论位置是偶数还是奇数,因此int除法将在给定列表中产生适当的索引。

希望有所帮助!