问题描述
我有一个左手和右手布局,需要将它们放置在 RecyclerView 的相应列中。我正在使用 StaggeredGridLayout,因为布局也可以有不同的大小。我正在尝试控制子布局的位置,但运气不佳,因为一旦左/右方向中断,它就会保持中断。
GridLayoutManager 在保持布局有序方面做得更好,但在使用较大布局时会产生奇怪的间距。即使我可以使用 GridLayoutManager,我仍然需要能够控制左侧/右侧,因为数据可以以各种顺序到达。
我还应该注意,这个 RecyclerView 已经在另一个 RecyclerView 内部,因此适配器和 layoutManager 被设置在父 RV 的 onBindViewHolder() 内部。
解决方法
我没有使用 GridLayoutManager 选项来解决这个问题,而是在 xml 中添加了 GridLayout。
<GridLayout
android:id="@+id/grid_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:columnCount="2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/text_panel">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/left_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/grid_container" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/right_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/grid_container" />
</GridLayout>
然后我在 OnBindViewHolder() 中将父 ArrayList 拆分为左右 ArrayList。我最终得到了两个子 RecyclerViews,但它有效并且 我可以很好地控制外观。
ArrayList<Breaker> leftList = new ArrayList<>();
ArrayList<Breaker> rightList = new ArrayList<>();
for(int i = 0; i < p.getCount(); i++) {
if (p.getB(i).getType() % 2 == 0) {
leftList.add(p.getB(i));
} else {
rightList.add(p.getB(i));
}
}
LinearLayoutManager leftLayout = new LinearLayoutManager(h.leftBView.getContext());
h.leftBView.setLayoutManager(leftLayout);
MultiAdapter leftBAdapter = new MultiBAdapter(leftList,h.leftBView.getContext());
h.leftBView.setAdapter(leftBAdapter);
LinearLayoutManager rightLayout = new LinearLayoutManager(h.rightBView.getContext());
h.rightBView.setLayoutManager(rightLayout);
MultiBAdapter rightBAdapter = new MultiBAdapter(rightList,h.rightBView.getContext());
h.rightBView.setAdapter(rightBAdapter);