第一次使用这个控件,发现相当的强大,已经彻底爱上了这个控件,以此记录一下
直接上代码
RecyclerviewActivity类
private RecyclerView recyclerView; private ArrayList<Integer> mDatas; private MyRecyclerViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recyclerview); recyclerView = (RecyclerView) findViewById(R.id.recyclerview); //2.声名为瀑布流的布局方式: 3列,垂直方向 StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL); //3.为recyclerView设置布局管理器 recyclerView.setLayoutManager(staggeredGridLayoutManager); initData();//初始化数据 //3.创建适配器 adapter = new MyRecyclerViewAdapter(this, mDatas); //设置添加,移除item的动画,DefaultItemAnimator为默认的 recyclerView.setItemAnimator(new DefaultItemAnimator()); //4.设置适配器 recyclerView.setAdapter(adapter); adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnRecyclerItemClickListener() { @Override public void onItemClick(View view, int position) { adapter.addItem(position, "添加的内容"); } }); adapter.setOnItemLongClickListener(new MyRecyclerViewAdapter.onRecyclerItemLongClickListener() { @Override public void onItemLongClick(View view, int position) { adapter.removeItem(position); } }); } protected void initData(){ mDatas=new ArrayList<>(); mDatas.add(R.drawable.a); mDatas.add(R.drawable.b); mDatas.add(R.drawable.c); mDatas.add(R.drawable.d); mDatas.add(R.drawable.e); mDatas.add(R.drawable.f); mDatas.add(R.drawable.g); mDatas.add(R.drawable.h); mDatas.add(R.drawable.l); mDatas.add(R.drawable.a); mDatas.add(R.drawable.b); mDatas.add(R.drawable.c); mDatas.add(R.drawable.d); mDatas.add(R.drawable.e); mDatas.add(R.drawable.f); mDatas.add(R.drawable.g); mDatas.add(R.drawable.h); mDatas.add(R.drawable.l); mDatas.add(R.drawable.a); mDatas.add(R.drawable.b); mDatas.add(R.drawable.c); mDatas.add(R.drawable.d); mDatas.add(R.drawable.e); mDatas.add(R.drawable.f); mDatas.add(R.drawable.g); mDatas.add(R.drawable.h); mDatas.add(R.drawable.l); mDatas.add(R.drawable.a); mDatas.add(R.drawable.b); mDatas.add(R.drawable.c); mDatas.add(R.drawable.d); mDatas.add(R.drawable.e); mDatas.add(R.drawable.f); mDatas.add(R.drawable.g); mDatas.add(R.drawable.h); mDatas.add(R.drawable.l); mDatas.add(R.drawable.a); mDatas.add(R.drawable.b); mDatas.add(R.drawable.c); mDatas.add(R.drawable.d); mDatas.add(R.drawable.e); mDatas.add(R.drawable.f); mDatas.add(R.drawable.g); mDatas.add(R.drawable.h); mDatas.add(R.drawable.l); }
MyRecyclerViewAdapter类
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> { private Context context; private List<Integer> list;//数据 private List<Integer> heightList; private OnRecyclerItemClickListener mOnItemClickListener;//单机事件 private onRecyclerItemLongClickListener mOnItemLongClickListener;//长按事件 public MyRecyclerViewAdapter(Context context,List<Integer> list){ this.context=context; this.list=list; //记录为每个空间产生的随机高度,避免滑回顶部出现空白 heightList = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { int height = new Random().nextInt(200) + 200;//[200,400)的随机数 heightList.add(height); } } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(context).inflate(R.layout.recycler_item_layout,parent,false); return new MyViewHolder(view); } /** * 绑定视图到holder,就如同ListView的getView(),但是这里已经把复用实现了,我们只需要填充数据就行. * 由于在复用的时候都是调用该方法填充数据,但是上滑的时候,又会随机产生高度设置到控件上,这样当滑 * 到顶部可能就会看到一片空白,因为后面随机产生的高度和之前的高度不一样,就不能填充屏幕了,所以 * 需要记录每个控件产生的随机高度,然后在复用的时候再设置上去 */ @Override public void onBindViewHolder(final MyViewHolder holder, int position) { holder.imageView.setImageResource(list.get(position)); //由于需要实现瀑布流的效果,所以需要动态改变控件的高度 ViewGroup.LayoutParams params=holder.imageView.getLayoutParams(); params.height=heightList.get(position); holder.imageView.setLayoutParams(params); //设置单机事件 if (mOnItemClickListener!=null){ holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(v,holder.getLayoutPosition()); } }); } //长按事件 if(mOnItemLongClickListener != null){ holder.imageView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //回调出去 mOnItemLongClickListener.onItemLongClick(v,holder.getLayoutPosition()); return true;//不返回true,松手还会去执行单击事件 } }); } } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ ImageView imageView; public MyViewHolder(View itemView) { super(itemView); imageView= (ImageView) itemView.findViewById(R.id.imageView); } } /** * 处理item的点击事件,因为recycler没有提供单击事件,所以只能自己写了 */ interface OnRecyclerItemClickListener{ public void onItemClick(View view,int position); } /** * 长按事件 */ interface onRecyclerItemLongClickListener{ public void onItemLongClick(View view, int position); } /** * 暴露给外面的设置单击事件 */ public void setOnItemClickListener(OnRecyclerItemClickListener onItemClickListener){ mOnItemClickListener = onItemClickListener; } /** * 暴露给外面的长按事件 */ public void setOnItemLongClickListener(onRecyclerItemLongClickListener onItemLongClickListener){ mOnItemLongClickListener = onItemLongClickListener; } /** * 向指定位置添加元素 */ public void addItem(int position, String value) { if(position > list.size()) { position = list.size(); } if(position < 0) { position = 0; } /** * 使用notifyItemInserted/notifyItemRemoved会有动画效果 * 而使用notifyDataSetChanged()则没有 */ list.add(position,R.drawable.a);//在集合中添加这条数据 heightList.add(position,new Random().nextInt(200) + 100);//添加一个随机高度,会在onBindViewHolder方法中得到设置 notifyItemInserted(position);//通知插入了数据 } /** * 移除指定位置元素 */ public Integer removeItem(int position) { if(position > list.size()-1) { return null; } heightList.remove(position);//删除添加的高度 Integer value = list.remove(position);//所以还需要手动在集合中删除一次 notifyItemRemoved(position);//通知删除了数据,但是没有删除list集合中的数据 return value; } }