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; }
三、实现效果

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218406.html原文链接:https://javaforall.net
