關於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的實現
類,類型包括Vertical和Horizontal,與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的判斷,同時實現點擊。
關於點擊事件的瞭解可看點擊打開鏈接