Android RecyclerView 详解(二) 点击事件绑定、瀑布流和Grid的实现

Android RecyclerView 详解(二) 点击事件绑定、瀑布流和Grid的实现

先来一张本篇文章的实现效果吧(没有合并行)

有行合并的

一丶点击事件的绑定
我们参考listView的onItemClickListener
(1)返回值为void
(2)有四个参数值
a.adapter的view
b.view被点击的控件
c.position位置
d.数据模型对象(方便得到数据)

(3)创建一个接口
    public interface onChildListener{
        void onChildClick(RecyclerView parent, View view, int position, String data);
    }
(4)写入属性中,并实现他的set方法
    private onChildListener onChildListener;

    public void setOnChildListener(MyAdapter.onChildListener onChildListener) {
        this.onChildListener = onChildListener;
    }

(5)如何得到parent属性
我们需要重写两个方法得到parent
    /**
     * 当连接到RecyclerView后,提供数据的时候调用这个方法
     * @param recyclerView
     */
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        this.recyclerView =recyclerView;
    }

    /**
     * 解绑
     * @param recyclerView
     */
    @Override
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
        super.onDetachedFromRecyclerView(recyclerView);
        recyclerView = null;
    }

(6)将控件和点击事件进行绑定

a.实现VIew.OnClickListener
    @Override
    public void onClick(View view) {
        int position = recyclerView.getChildAdapterPosition(view);
        if (recyclerView!=null&&listener!=null&&!recyclerView.getItemAnimator().isRunning()) {
            listener.onChildClick(recyclerView,view,position,list.get(position));
        }
    }

这里做一下说明,前两个参数判断你的父布局和你的点击接口是否不为空,那么最后一个判断的是你的删除或者是其他的动画是否在执行,我们需要在动画执行完之后才能实现他的点击事件,否则会出错。

b.控件调用点击方法
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
        view.setOnClickListener(this);
        return new MyViewHolder(view);
    }
(7)在你的需要的地方实现
    @Override
    public void onChildClick(RecyclerView parent, View view, int position, String data) {
        Toast.makeText(this,"点击了第"+position+"个条目",Toast.LENGTH_SHORT).show();
    }
(8)将实现的接口用adapter传递到MyAdapter中去
myRecyclerVIew.setAdapter(myAdapter);

至于如何实现条目内的点击直接下载源码就好在下部有链接~

二、设置LayoutManager

1.因为我们需要观察瀑布流布局所以将字段的长度进行更改方便观察
    private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            if (i%3==0) {
                list.add(String.format(Locale.CHINA,"第%03d条数据%s",i,"--------------"));
            }else{
                list.add(String.format(Locale.CHINA,"第%03d条数据",i));
            }

        }
    }
2.为了方便更改我设置了三个按钮进行更改LayoutManager将在这三个按钮的点击事件中对其进行更改,并加上margin方便查看

(1)LinearLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayout.VERTICAL,false);
                myRecyclerVIew.setLayoutManager(linearLayoutManager);
他有三个参数(当前对象,纵向还是横向,是否翻转布局)
如果是所谓的翻转布局如果为true就是翻转布局那么整个RecyclerView将会翻转显示数据。

(2)GridLayoutManager
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
                myRecyclerVIew.setLayoutManager(gridLayoutManager);
他有4个参数跟List不同的是他的第二个参数为多少行或者说是多少列。

(3)StaggeredGridLayoutManager(瀑布流布局)
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
                myRecyclerVIew.setLayoutManager(staggeredGridLayoutManager);
两个参数(多少行或者列,纵向还是横向)

3.那么有时候你想要合并某些行和某些列的话如何操作呢?
                //设置跨行或者跨列的数目
                gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                    @Override
                    public int getSpanSize(int position) {
                        if (position==0) {
                            return 3;
                        }else if(position==1){
                            return 2;
                        }
                        return 1;
                    }
                });

这个返回的值就是你将占用多少的行或者列。




源码:源码链接














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章