GridLayoutManager
一、 引入问题

要实现这个布局,我们需要怎么做呢?
- 用线性布局画各种长度尺寸的button?
可行,但扩展性不够,假如将第二行和第三行互换位置呢 再增加几行呢 再增加几种类型的item呢? - 我们可以试下recyclerview的网格布局,进行动态适配各行的item
可行,扩展性够
二、解决问题
方案:使用recyclerview的网格布局
- 定义itemType,针对不同的类型填充不同的布局
这里我们用不同itemType,之后可以在任意位置扩展这些类型的item
- 核心代码
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recycler_view);
init();
}
public void init() {
GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), 3);
mRecyclerView.setLayoutManager(gridLayoutManager);
mAdapter = new RecyAdapter();
mRecyclerView.setAdapter(mAdapter);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int itemViewType = mAdapter.getItemViewType(position);
switch (itemViewType) {
case Constant.THREE_COLUME_ITEM_TYPE:
return 3;
case Constant.TWO_COLUME_ITEM_TYPE:
return 2;
default:
return 1;
}
}
});
mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.bottom = 30;
outRect.left = 30;
}
});
}
}
public class RecyAdapter extends RecyclerView.Adapter {
private List<Integer> mData = new ArrayList<>();
public RecyAdapter() {
mData.add(0);
mData.add(1);
mData.add(2);
mData.add(3);
mData.add(4);
mData.add(5);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
int layoutId;
switch (viewType) {
case Constant.THREE_COLUME_ITEM_TYPE:
layoutId = R.layout.item_three_view_layout;
break;
case Constant.TWO_COLUME_ITEM_TYPE:
layoutId = R.layout.item_two_view_layout;
break;
default:
layoutId = R.layout.item_view_layout;
break;
}
view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
return new VH(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
VH vh = (VH) holder;
vh.mText.setText(mData.get(position) + "");
}
@Override
public int getItemCount() {
return mData.size();
}
@Override
public int getItemViewType(int position) {
switch (position) {
case 0:
return Constant.THREE_COLUME_ITEM_TYPE;
case 5:
return Constant.TWO_COLUME_ITEM_TYPE;
default:
return Constant.ONE_COLUME_ITEM_TYPE;
}
}
class VH extends RecyclerView.ViewHolder {
TextView mText;
public VH(@NonNull View itemView) {
super(itemView);
mText = itemView.findViewById(R.id.text);
}
}
}
public class Constant {
public static final int THREE_COLUME_ITEM_TYPE = 0;
public static final int ONE_COLUME_ITEM_TYPE = 1;
public static final int TWO_COLUME_ITEM_TYPE = 2;
}
三、实现效果

本文主要介绍了如何在Android中利用RecyclerView的GridLayoutManager来创建网格布局,以解决线性布局扩展性不足的问题。通过定义itemType并填充不同布局,实现动态适配各行的item,从而达到更好的扩展性。
1290

被折叠的 条评论
为什么被折叠?



