RecyclerVIew 适用于4.0以上,在gradle的dependcies中加入
compile 'com.android.support:recyclerview-v7:23.2.1'
首先在布局文件中加入RecyclerView
使用RecyclerView 需要配合使用LayoutManager以及Adapter
LayoutManager定义了视图的类型 :
- LinearLayoutManager(列表,可以设置横向或竖向 setOrientation())
- GridLayoutManager(网格)
- StaggeredGridLayoutManager(瀑布流)
为recyclerView设置LayoutManager
rv_test = (RecyclerView) findViewById(R.id.rv_test); layoutManager = new LinearLayoutManager(this); //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 rv_test.setHasFixedSize(true); rv_test.setLayoutManager(layoutManager);
为recyclerView设置Adapter
mAdapter = new MyAdapter(getDummyDatas()); rv_test.setAdapter(mAdapter);
创建自定义Adapter 继承RecyclerView.Adapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{ public String[] datas = null; public MyAdapter(String[] datas) { this.datas = datas; } //创建新View,被LayoutManager所调用 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false); ViewHolder vh = new ViewHolder(view); return vh; } //将数据与界面进行绑定的操作 @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { viewHolder.mTextView.setText(datas[position]); viewHolder.itemView.setTag(datas[position]); } //获取数据的数量 @Override public int getItemCount() { return datas.length; } //自定义的ViewHolder,持有每个Item的的所有界面元素 public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(View view) { super(view); mTextView = (TextView) view.findViewById(R.id.tv_app); } } }
监听点击事件
RecyclerView没有原生的点击事件监听器,需要自己实现。
在Adapter中,定义一个onRecyclerViewItemClickListener 接口
public static interface OnRecyclerViewItemClickListener{ void onItemClick(View view, String data); }
添加接口和设置Adapter接口的方法
private OnRecyclerViewItemClickListener mOnItemClickListener = null;
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; }
Adapter实现View.OnClickListener接口(需在onCreateViewHolder时设置 view.setOnClickListener(this)),
触发点击事件后,调用 mOnItemClickListener.onItemClick
数据通过 v.getTag()获取,在onBindViewHolder时 通过 viewHolder.itemView.setTag()设置。
public void onClick(View v) { if( mOnItemClickListener!=null ){ mOnItemClickListener.onItemClick(v,(String)v.getTag()); } }
在MainActivity中调用Adapter设置接口的方法 并实现接口
mAdapter.setOnItemClickListener(new MyAdapter.OnRecyclerViewItemClickListener() { @Override public void onItemClick(View view, String data) { Toast.makeText(MainActivity.this,"clicked text = " + data,Toast.LENGTH_LONG).show(); } });