Android中RecyclerView的基本用法

關於RecyclerView,在很早以前就看到過,不過今天才對RecyclerView進行了瞭解,

這個控件是屬於V7包下的,可以添加依賴

compile 'com.android.support:recyclerview-v7:23.1.0'

RecyclerView可以說是ListView的一種優化,強制使用ViewHolder,同時可以通過setLayoutManager進行不同佈局的選擇,總共有三種佈局:

1.LinearLayoutManager 線性佈局,LayoutManager的實現類,類型包括Vertical和Horizontal,

          可以看到線性佈局有三種構造函數

參數含義:當前上下文,將用於訪問資源。

參數含義:context 上下文對象,orientation 佈局裏的數據展示的方向,有兩種方式

               LinearLayoutManager.HORIZONTAL,LinearLayoutManager.VERTICAL

 如果設置爲true,從最終的佈局開始。

2.GridLayoutManager格子布局,繼承自LinearLayoutManager,

實現效果類似GridView

3.StaggeredGridLayoutManager交錯的格子布局,同樣也是LayoutManager的實現

類,類型包括VerticalHorizontal與GridLayoutManager很相似,

不過是交錯的格子,也就是寬高不等的格子視圖,類似瀑布流的效果

下面詳細介紹RecyclerView的使用:

1.在佈局中添加控件:

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

2.在類中進行初始化:

    private RecyclerView recyclerView;
    //存放數據
    private List<String> list;
    //佈局管理器
    private android.support.v7.widget.RecyclerView.LayoutManager layoutManager;
    //RecyclerView的Adapter
    private MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        //添加數據
        list = new ArrayList<String>();
        initData();
        //設置RecyclerView的顯示佈局
        recyclerView.setLayoutManager(layoutManager);
        //這裏添加動畫,有一個默認的動畫
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //可以添加item的下劃線,也就是可以自動以,繼承ItemDecoration
//        recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
//        });
        myAdapter = new MyAdapter(list,this);
        recyclerView.setAdapter(myAdapter);
        //自己添加點擊回調
        myAdapter.setOnItemClick(new MyAdapter.OnItemClick() {
            @Override
            public void click(View item, int position) {
                Toast.makeText(MainActivity.this,position + "",Toast.LENGTH_LONG).show();
            }
        });
    }
代碼中有註釋,這裏就不過多解釋,在其中Adapter需要我們通過繼承RecyclerView.Adapte

進行編寫。如果想自己定義ItemDecoration,可以繼承ItemDecoration進行定義。

3.MyAdapter的編寫:

編寫類繼承RecyclerView.adapter,並實現裏面的三個方法:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout,null);
    return new MyHolder(view,onItemClick);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    MyHolder hodler1 = (MyHolder) holder;
    hodler1.textView.setText(list.get(position));


}

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

第一個函數返回ViewHolder,第二個函數ViewHolder和數據源的綁定,第三個函數

得到集合的個數。

實現ViewHoler類:

class MyHolder extends  RecyclerView.ViewHolder implements View.OnClickListener {
        TextView textView;
        private OnItemClick onItemClick;
        public MyHolder(View itemView, OnItemClick onItemClick) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textView);
//            itemView.setOnClickListener(this);
//            itemView.setOnLongClickListener(this);
            //點擊回調
            this.onItemClick = onItemClick;
            itemView.setOnClickListener(this);
        }
        //點擊進行回調
        @Override
        public void onClick(View v) {
            if(onItemClick != null){
                onItemClick.click(itemView,getAdapterPosition());
            }
        }
    }
在ViewHolder中進行控件的綁定,

如果不考慮點擊事件,一個RecyclerView的簡單實用就實現了,但往往我們都有點擊事件的處理,而RecyclerView本身並沒有clickListener的監聽,這就需要我們自己寫回調進行處理,因爲ViewHolder可以拿到每個Item的根佈局,所以可以再ViewHolderzhogn中做文章

點擊事件的處理:

1.進行接口的編寫:

	interface OnItemClick{
 	   void click(View item,int position);
	}

	private OnItemClick onItemClick;
	
	public void setOnItemClick(OnItemClick onItemClick) {
	    this.onItemClick = onItemClick;
	}
在實現onCreateViewHolder方法時,創建ViewHolder對OnItemClick對象進行傳遞

2.在ViewHolder中對點擊事件進行處理

   class MyHolder extends  RecyclerView.ViewHolder implements View.OnClickListener {
        TextView textView;
        private OnItemClick onItemClick;
        public MyHolder(View itemView, OnItemClick onItemClick) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textView);
//            itemView.setOnClickListener(this);
//            itemView.setOnLongClickListener(this);
            //點擊回調
            this.onItemClick = onItemClick;
            itemView.setOnClickListener(this);
        }
        //點擊進行回調
        @Override
        public void onClick(View v) {
            if(onItemClick != null){
                onItemClick.click(itemView,getAdapterPosition());
            }
        }
    }
在構造函數中進行OnItemClick的賦值,同時設置每個條目的點擊事件,在ItemView的點擊事件中進行OnItemClick的判斷,同時實現點擊。



關於點擊事件的瞭解可看點擊打開鏈接




發佈了38 篇原創文章 · 獲贊 28 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章