RecyclerView 将所有的显示规则交给一个叫 LayoutManager 的类去完成了。LayoutManager 是一个抽象类,系统已经为我们提供了三个默认的实现类,分别是 LinearLayoutManager 、 GridLayoutManager 、 StaggeredGridLayoutManager,从名字我们就能看出来了,分别是,线性显示、网格显示、瀑布流显示。
Recycle view和Listviet、GridView类似,都是可以显示同一种类型的View的集合控件。
首先看最简单的用法:
1.在build.gradle文件中加入
compile 'com.android.support:recyclerview-v7:24.0.0'
2.创建对象
RecyclerView rv_main_activity = (RecyclerView) findViewById(R.id.rv_main_activity);
3.设置显示规则,这里是用线性显示
rv_main_activity.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
4.设置适配器
rv_main_activity.setAdapter(linearLayoutAdapter);
适配器是用来这是每个item显示内容的。通常,我们写Listview的适配器的时候是先继承BaseAdapter,实现四个抽象方法,创建一个静态的Viewholder。
而Recycleview也是类似的步骤,首先继承RecycleView.Adapter类,实现3个抽象方法,创建一个静态的ViewHolder,继承Recycleview.ViewHolder 类。
下面直接上代码:
/**
* 作者:sufferable 17/2/10 14:24
* 邮箱:xsxdg666@gmail.com
*/
public class LinearLayoutAdapter extends RecyclerView.Adapter<LinearLayoutAdapter.MyHolder> {
private ArrayList<String> mList;
private Context mContext;
public LinearLayoutAdapter(ArrayList<String> list, Context context) {
mList = list;
mContext = context;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
RecyclerView.ViewHolder holder = null;
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
view = View.inflate(mContext, R.layout.item_linearlayout, null);
view.setLayoutParams(layoutParams);
return new MyHolder(view);
}
@Override
public void onBindViewHolder(MyHolder holder, final int position) {
holder.tv_item.setText(mList.get(position));
holder.tv_item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mOnRecyclerViewItemClickListener != null) {
mOnRecyclerViewItemClickListener.onItemClickListener(view, position);
}
}
});
}
//返回item的条数
@Override
public int getItemCount() {
return mList.size();
}
public class MyHolder extends RecyclerView.ViewHolder {
TextView tv_item;
public MyHolder(View itemView) {
super(itemView);
tv_item = (TextView) itemView.findViewById(R.id.tv_item_left);
}
}
private OnRecyclerViewItemClickListener mOnRecyclerViewItemClickListener;
public void setOnRecyclerViewItemClickListener(OnRecyclerViewItemClickListener recyclerViewItemClickListener) {
this.mOnRecyclerViewItemClickListener = recyclerViewItemClickListener;
}
public interface OnRecyclerViewItemClickListener {
void onItemClickListener(View View, int positon);
}
}
因为Recycleview没有OnItemClickListener方法,所以点击事件可以直接写在Adapter里面,也可以像我上面代码写的那样,把点击事件做成接口暴露出去:
linearLayoutAdapter.setOnRecyclerViewItemClickListener(mOnRecyclerViewItemClickListener);
LinearLayoutAdapter.OnRecyclerViewItemClickListener mOnRecyclerViewItemClickListener = new LinearLayoutAdapter.OnRecyclerViewItemClickListener() {
@Override
public void onItemClickListener(View View, int positon) {
Intent intent = new Inten