RecyclerView是一个增强版的ListView,不仅可以实现和ListView同样的效果,还优化了ListView中存在的各种不足之处
RecyclerView能够实现横向滚动,这是ListView所不能实现的
添加依赖
compile 'com.android.support:design:25.3.1'
1. RecyclerView初始化及基本设置
//给RecyclerView设置布局管理器
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
//初始化适配器
adapter = new MyRecyclerViewAdapter(getContext(), list);
//给recyclerView添加适配器
recyclerView.setAdapter(adapter);
//设置分隔线
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));
//设置增加或删除条目的动画
recyclerView.setItemAnimator( new DefaultItemAnimator());
//RecyclerView除了LinearLayoutManager 之外,
//还提供了GridlayoutManager和StaggeredGridlayoutManager这两种内置的布局排列方式
//GridlayoutManager可以用于实现网格布局
//StaggeredGridlayoutManager可以用于实现瀑布流布局,
//第一个参数表示布局的列数
//第二个参数表示布局的方向,这里我们传入StaggeredGridLayoutManager.VERTICAL,表示布局纵向排列
//StaggeredGridLayoutManager layoutmanager =
//new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
2.Adapter的完整代码
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> implements View.OnClickListener {
//Adapter继承RecyclerView.Adapter 泛型是自定义的ViewHolder
//自定义ViewHolder 继承 RecyclerView.ViewHolder
private Context context;
private List<String> list;
//接口实例
private RecyclerViewOnItemClickListener onItemClickListener;
public MyRecyclerViewAdapter(Context context) {
this.context=context;
list=new ArrayList<>();
}
public MyRecyclerViewAdapter(Context context,List<String> list) {
this.context=context;
this.list=list;
}
//添加数据
public void addData(List<String> list) {
this.list.addAll(list);
notifyDataSetChanged();
}
//删除所有数据
public void deleteAllData(){
this.list.clear();
notifyDataSetChanged();
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
context).inflate(R.layout.list_item1, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.tv.setText(list.get(position));
//设置点击事件
holder.root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(onItemClickListener!=null){
int pos = holder.getLayoutPosition();
onItemClickListener.onItemClickListener(holder.itemView, pos);
}
}
});
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
public void setRecyclerViewOnItemClickListener(RecyclerViewOnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
//创建点击事件的接口
public interface OnRecyclerViewItemClickListener {
void onItemClickListener(View view, int position);
}
/**
* ViewHolder的类,用于缓存控件
*/
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
private View root;
public MyViewHolder(View view) {
super(view);
this.root = view;
tv = (TextView) view.findViewById(R.id.list_item1_tv);
}
}
}
3.自定义item的点击事件的外部调用
adapter.setRecyclerViewOnItemClickListener(new MyRecyclerViewAdapter.RecyclerViewOnItemClickListener() {
@Override
public void onItemClickListener(View view, int position) {
Log.e("====","点击的是 " + position + " item");
}
});
说明
RecyclerView并没有像ListView一样暴露出Item点击事件或者长按事件处理的api,所以需要我们自己来实现
item的点击事件处理。上面的点击事件是通过在绑定ViewHolder的时候设置监听,然后通过Apater回调出去
实现的。