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;
                    }
                });

這個返回的值就是你將佔用多少的行或者列。




源碼:源碼鏈接














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