RecyclerView的使用(1)

Recycler介紹:RecyclerView是Android L版本中新添加的一個用來取代ListView的SDK,它的靈活性與可替代性比listview更好。接下來通過一系列的文章講解如何使用RecyclerView,徹底拋棄ListView.

RecylerView和ListView的目的性其實都是去維護少量的View來展示大量的數據集,而RecyclerView的優點在於提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。

  • 如果你想要控制它的顯示方式,就可以使用LayoutManager
  • 如果你想要自定義item分割線,可以使用ItemDecoration
  • 如果你想要item的增刪動畫,可以使用ItemAnimator

但是對於RecylerView來說,它並不像ListView一樣直接給你提供了OnItemClickListener、OnItemClickLongListener這樣的點擊事件,以至於你想實現點擊事件需要通過你自己來實現這些.下面我們就來談一談關於RecyclerView的基本使用吧.

添加依賴

dependencies {
    compile 'com.android.support:recyclerview-v7:24.0.0'
    .........   
}

在XML佈局中

        <android.support.v7.widget.RecyclerView
            android:id="@+id/mList"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />

沒有什麼特別的地方、和ListView一樣

需要一個RecyclerView適配器

public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.Demo>{

    private String[] data;
    private Context mContext;

    public DemoAdapter(String[] datas, Context context){
        this.data = datas;
        mContext = context;
    }

    @Override
    public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
        return new Demo(rootView);
    }

    @Override
    public void onBindViewHolder(Demo holder, int position) {
        holder.imageView.setImageResource(R.drawable.back_default);
        holder.textView.setText(data[position]);
    }

    @Override
    public int getItemCount() {
        return data.length;
    }

    class Demo extends RecyclerView.ViewHolder {
        private ImageView imageView;
        private TextView textView;
        public Demo(View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.iv_1);
            textView = itemView.findViewById(R.id.tv_1);
        }
    }
}

比較簡單的一個使用,在OnCreateViewHolder中創建視圖,在onBindViewHolder中綁定視圖數據,RecyclerView是自動複用視圖的,所以不需要像listView中使用代碼去做,當然你也可以手動來設置不復用,獲取OnCreateViewHolder中創建出來的holder,holder.setIsRecyclable(false);

LayoutManager

其實SDK中自帶了三種LayoutManager

  • LinearLayoutManager
  • GridLayoutManager
  • StaggeredGridLayoutManager
    分別是
  • 線性佈局:可以設置橫向和縱向
  • 網格佈局:可以在設置多少行列、以及橫向縱向
  • 瀑布流佈局

使用

以上這些必要的工作已經做好了嗎,下面我們就來試一下RecyclerView的簡單使用吧

RecyclerView mRecyclerView = findViewById(R.id.mListView)
mRecyclerView.setLayoutManager(new LinearLayoutManager(this))
mRecyclerView.setAdapter(new DemoAdapter(data,this))

這樣就出現一個簡單的RecyclerView列表

關於RecyclerView的點擊事件

RecyclerView是沒有像ListView那樣很直白的點擊事件的,這就需要我們自己來進行處理了,
我們可以在

@Override
    public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
        return new Demo(rootView);
    }

這部分代碼中、對rootView進行點擊事件
rootView.setOnClickListener(new OnClickListener(){
………
})
那麼我們怎麼來傳遞當前的點到這個位置的值呢、我們並沒有看到position這個參數
其實是可以的,看看怎麼做

@Override
    public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
        Demo demo = new Demo(rootView);
        int position = demo.getAdapterPosition()
        return demo 
    }

這樣就獲取到了position,我們也可以在內部創建一個自己的監聽接口、將點擊的這個事件傳遞到外面,這樣就可以做到和listView一樣的寫法,我就姑且不在這裏做了。

結尾

剩下的還有一些自己來定義動畫、自己定義layoutManger、分割線、以及使用中遇到的一些坑,我們下次再說

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