RecyclerView是一種新的視圖組,目標(biāo)是為任何基于適配器的視圖提供相似的渲染方式。它被作為ListView和GridView控件的繼承者,在最新的support-v7版本中提供使用。
RecyclerView架構(gòu),提供了一種插拔式的體驗(yàn),高度的解耦,異常的靈活,通過設(shè)置它提供的不同LayoutManager、ItemDecoration、ItemAnimator實(shí)現(xiàn)令人瞠目的效果
(總之ListView和GridView能做的RecyclerView都能做,并且能實(shí)現(xiàn)瀑布流效果)
ListView效果
使用方法:
- 在build.gradle中關(guān)聯(lián)庫:
- compile 'com.android.support:recyclerview-v7:23.3.0'
tip:此處的23.3.0不固定,于appcompat版本一致皆可
(也可以在目錄結(jié)構(gòu)中找到app右鍵-open Module Settings-Dependencies-+-Library dependency-找到recyclerview的v7包,也要完成上面的tip)
- 準(zhǔn)備Item項(xiàng)的顯示方式
item_recyclerview.xml
如:此例子中只放了ImageView和TextView - **準(zhǔn)備適配器 **
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder>{
private final Context context;
private ArrayList<String> datas;
/**構(gòu)造方法**/
public MyRecyclerViewAdapter (Context context,ArrayList<String> datas) {
this.context=context;
this.datas=datas;
}
class MyViewHolder extends RecyclerView.ViewHolder{
private ImageView iv_icon;
private TextView tv_title;
public MyViewHolder (View itemView){
super(itemView);
iv_icon=(ImageView).findViewById(R.id.iv_icon);
tv_title=(TextView).findViewById(R.id.tv_title);
}
}
//相當(dāng)于getView方法中創(chuàng)建View和ViewHolder
public MyViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
View itemView=View.inflate(context,R.layout.item_recyclerview,null);
return new MyViewHolder(itemView);
}
//相當(dāng)于getView方法中綁定數(shù)據(jù)
public MyViewHolder onCreateViewHolder(ViewGroup parent,int position){
String data=datas.get(position); //根據(jù)位置在datas中獲取值
holder.tv_title.setText(data);
}
//得到item的條數(shù)
public int getItemCount(){
return datas.size();
}
}```
4.RecyclerViewActivity.java
private RecyclerView recyclerview;
private ArrayList<String> datas;
private MyRecyclerViewAdapter adapter;
onCreate()方法中:
{ initView();
initData();//準(zhǔn)備數(shù)據(jù)源
initAdapter();//為RecyclerView適配Adapter;
setLayoutManager();
}
private void initView(){
recyclerview=(RecyclerView)findViewById(R.id.recyclerview);
//此處注意 第一次使用時(shí)在xml中定義控件要用全包名即(<android.support.v7.widget.RecyclerView ... />)
}
//準(zhǔn)備數(shù)據(jù)源
private void initData(){
datas=new ArrayList<String> ();
for(int i=0;i<100;i++){ data.add("content"+i);}
}
//適配器
private void initAdapter(){
adapter=new MyRecyclerViewAdapter(RecyclerViewActivity.this,datas);
recyclerview.setAdapter(adapter);
}
//為recyclerview設(shè)置layoutManager
private void initAdapter(){
recyclerview.setLayoutManager(new LinearLayoutManager(MyRecyclerViewActivity.this,LinearLayout.VERTICAL,false));
}
* LinearLayoutManager(Context context,int orientation,boolean reverseLayout)
參數(shù):context:上下文
orientation:方向
reverseLayout:是否倒轉(zhuǎn)
######RecyclerView的OnItemSelect
RecyclerView本身不支持點(diǎn)擊事件,要在Adapter中MyViewHolder類中實(shí)現(xiàn)
為了能在MyRecyclerViewAdapter中可以用點(diǎn)擊事件,可以定義接口來實(shí)現(xiàn)
在MyRecyclerViewAdapter中定義接口
public interface OnItemClickListener{
/**
*當(dāng)RecyclerView某個(gè)項(xiàng)被點(diǎn)擊時(shí)候回調(diào)
*@param view 點(diǎn)擊item的視圖
*@param data 點(diǎn)擊得到的數(shù)據(jù)
*/
public void onItemClick(View view,String data);
}
//實(shí)例化
private OnItemClickListener onItemClickListener;
//設(shè)置setter方法來設(shè)置RecyclerView某條的監(jiān)聽
public void setOnItemClickListener (OnItemClickListener onItemClickListener){
this.onItemClickListener=onItemClickListener;
}