recyclerview 实现带标题的Grideview 不嵌套


项目中需要实现微信钱包页面类似的布局,我第一次看到后觉得很容易,用recyclerview嵌套grideview就能实现,往回一想太麻烦,

并且要写好多adapter和相应的点击事件。于是我想能不能只用recyclerview不嵌套能不能实现。在网上搜到一个神奇的方法解决了我的问题

LayoutManager.setSpanSizeLookup(SpanSizeLookup loopup)

   private void initView() {
        recycleView = (RecyclerView) findViewById(R.id.recycleView);
        GridLayoutManager manager = new GridLayoutManager(this,3, LinearLayoutManager.VERTICAL,false);
        MyAdapter adapter = new MyAdapter(list);
        recycleView.setAdapter(adapter);
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return list.get(position).spanCount;
            }
        });
        recycleView.setLayoutManager(manager);
    }
例如我LayoutManager设置为GrideLayoutManager spancount设置为3 oritiation为vertical,每个item的spanSize为1,
每个小标题的spansize为3,这个getSpanSize(int positon)方法返回的值为

3,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,在需要标题的地方返回3,item返回1

效果如下


上面的核心代码已经贴出,Adapter代码如下

public class MyAdapter extends RecyclerView.Adapter {
    private List<GrideData> list;

    public MyAdapter(List<GrideData> list) {
        this.list = list;
    }

    @Override
    public int getItemViewType(int position) {
        return  list.get(position).viewType;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == GrideData.TYPE_GRIDE) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.gride_item, parent,false);
            GrideHolder holder = new GrideHolder(view);
            return holder;
        } else {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.linear_itme, parent,false);
            LinearHolder holder = new LinearHolder(view);
            return holder;
        }

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        GrideData grideData = list.get(position);
        if (grideData.viewType == GrideData.TYPE_GRIDE) {
            GrideHolder holder1 = (GrideHolder) holder;
            holder1.setText(position+"--");
        } else {
            LinearHolder holder1 = (LinearHolder) holder;
            holder1.setText(position+"++");
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class GrideHolder extends RecyclerView.ViewHolder{
        TextView textView;
        public GrideHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textView);
        }

        public void setText(String text) {
            textView.setText(text);
        }
    }

    public static class LinearHolder extends RecyclerView.ViewHolder{
        TextView textView;
        public LinearHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textView);
        }

        public void setText(String text) {
            textView.setText(text);
        }
    }
}

bean代码

public class GrideData {
    public static final int TYPE_LINEAR = 0;
    public static final int TYPE_GRIDE = 1;
    public int viewType = 1,spanCount=1;
    public String data;

    public GrideData(int viewType, String data) {
        this.viewType = viewType;
        this.data = data;
        if (viewType == TYPE_GRIDE) {
            spanCount = 1;
        } else {
            spanCount = 3;
        }
    }
}

Activity

public class MainActivity extends AppCompatActivity {
    private RecyclerView recycleView;
    private List<GrideData> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_mutify_grideview);
        initData();
        initView();
    }

    public void initData() {
        list = new ArrayList<>();
        for (int i=0;i<30;i++) {
            if (i == 0 || i==6 || i==20) {
                list.add(new GrideData(TYPE_LINEAR, i + ""));
            } else {
                list.add(new GrideData(TYPE_GRIDE, i + ""));
            }
        }
    }

    private void initView() {
        recycleView = (RecyclerView) findViewById(R.id.recycleView);
        GridLayoutManager manager = new GridLayoutManager(this,3, LinearLayoutManager.VERTICAL,false);
        MyAdapter adapter = new MyAdapter(list);
        recycleView.setAdapter(adapter);
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return list.get(position).spanCount;
            }
        });
        recycleView.setLayoutManager(manager);
    }
}
好了,尽情的开撸吧!



猜你喜欢

转载自blog.csdn.net/qq_35599978/article/details/80109415