RecycleView(二)
来源:互联网 发布:泡泡堂mac版官方下载 编辑:程序博客网 时间:2024/05/22 07:08
上一篇讲述了RecycleView 的小demo 此篇讲述RecycleView常用的方法和知识点或是和listview或是gridview不一样的东西
RecyclerView有如下的优点:
RecylerView封装了viewholder的回收复用,也就是说是RecyclerView是面向ViewHolder编程而不是View RecyclerView高度解耦,非常灵活。RecyclerView不仅可以像ListView一样显示列表视图,还可以显示网格视图等。只要你传入不同的LayoutManager就可以控制显示不同的样式。
RecyclerView提供的LayoutManager有:
LinearLayoutManager:ListView
GridLayoutManager:GridView;
StaggeredGridLayoutManager瀑布流效果 横向Gridview或是Listview。
RecyclerView可以通过ItemDecoration控制Item之间的间隔 RecyclerView可以通过ItemAnimator控制Item的增删动画事件的处理就无效了,就算强制获取焦点 。
1.adapter listview和gridview与RecycleView的区别
前两者使用adapter时是继承BaseAdapter 重写
1.1.构造方法
private List<Bean> list;
private Context context;
public CompanyListAdapter(Context context,List<Bean> list){
this.context=context;this.list=list;
}
1.2.getCount方法
@Override
public int getCount() {
return list.size();
}
1.3.getItem方法
@Override
public Object getItem(int arg0) {
return list.get(arg0);
}
1.4.getItemId方法
@Override
public long getItemId(int arg0) {
return arg0;
}
1.5.getView方法
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
ViewHolder vh;
if(arg1==null){
arg1=View.inflate(context, R.layout.companylist_listview, null);
vh=new ViewHolder();
vh.piciv=(ImageView) arg1.findViewById(R.id.companylist_listview_companyiv);
vh.companytv=(TextView) arg1.findViewById(R.id.companylist_listview_companytv);
vh.rb=(RatingBar) arg1.findViewById(R.id.companylist_listview_ratingbar);
vh.numtv=(TextView) arg1.findViewById(R.id.companylist_listview_numtv);
arg1.setTag(vh);
}else{
vh=(ViewHolder) arg1.getTag();
}
return arg1;
}
1.6.ViewHolder类
public static class ViewHolder{
private ImageView piciv;
private TextView companytv;
private RatingBar rb;
private TextView numtv;
}
RecycleView使用adapter时是继承RecyclerView.Adapter<MyAdapter.ViewHolder>重写
2.1.构造方法
private Context context;private List<Bean> list;
public MyAdapter(Context context,List<Bean> list){ this.context=context; this.list=list;}
2.2.onCreateViewHolder方法
@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view=mInflater.inflate(R.layout.listviewitem, parent, false); ViewHolder holder = new ViewHolder(view); return holder;}
2.3.onBindViewHolder方法
@Overridepublic void onBindViewHolder(ViewHolder holder, int position) { Actor a=list.get(position); String name=a.getName(); holder.nametv.setText(name); String path=a.getPath(); Log.d("MyAdapter","path----:"+path); if(!(TextUtils.isEmpty(path))){ MyAPP.imageLoader.displayImage(path,holder.iv,options,new AnimateFirstDisplayListener()); }else{ holder.iv.setBackgroundResource(R.mipmap.ic_launcher); } //item监听 final int pp=position; if(ai!=null){ //点击item holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ai.OnItemCilck(v,pp); } }); //长按item holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { ai.OnLongItemCilck(v,pp); return true; } }); }}
2.4.getItemCount方法
@Overridepublic int getItemCount() { return list.size();}
2.5.ViewHolder类
class ViewHolder extends RecyclerView.ViewHolder{ private TextView nametv; private ImageView iv; public ViewHolder(View itemView) { super(itemView); nametv= (TextView) itemView.findViewById(R.id.name); iv= (ImageView) itemView.findViewById(R.id.pic); }}
2.6.添加数据
public void addData(Actor actor,int position) { list.add(position, actor); notifyItemInserted(position); notifyItemRangeChanged(position,list.size());}
2.7.删除数据
public void removeData(int position) { list.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position,list.size());}
2.RecycleView 没有外接的点击及长按事件需要手动添加
2.1.暴露给前台页面使用的方法
private adapterinterface ai;public void setOnItemClickAndLongListener(adapterinterface ai ){ this.ai=ai;}
2.2.adapter里给监听赋值
final int pp=position;if(ai!=null){ //点击item holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ai.OnItemCilck(v,pp); } }); //长按item holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { ai.OnLongItemCilck(v,pp); return true; } });}
2.3.前台页面(activity)使用
adapter.setOnItemClickAndLongListener(new adapterinterface() { @Override public void OnItemCilck(View view, int position) { String result=list.get(position).getName(); Toast.makeText(RecycleViewActivity.this,"点击"+result,Toast.LENGTH_SHORT).show(); } @Override public void OnLongItemCilck(View view, int position) { String result=list.get(position).getName(); Toast.makeText(RecycleViewActivity.this,"长按"+result,Toast.LENGTH_SHORT).show(); }});
3.RecycleView可以有三种状态 通过LayoutManager管理
recyclerView.setLayoutManager(new LinearLayoutManager(RecycleViewActivity.this));//ListView
recyclerView.setLayoutManager(new GridLayoutManager(RecycleViewActivity.this,4));//GridView 第二个参数 列数
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.HORIZONTAL));//HorizontalGridView 第一个参数行数(HORIZONTAL)或是列数(VERTICAL) 第二个参数 HORIZONTAL水平 VERTICAL垂直(相当于gridview)
4.控制Item间的间隔
recyclerView.addItemDecoration(new SpacesItemDecoration(16));
/** * Created by Administrator on 2017/3/17 0017. */public class SpacesItemDecoration extends RecyclerView.ItemDecoration { private int space; public SpacesItemDecoration(int space) { this.space=space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left=space; outRect.right=space; outRect.bottom=space; if(parent.getChildAdapterPosition(view)==0){ outRect.top=space; } }}
5.Item增删的动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
- RecycleView(二)
- RecycleView(二)
- RecycleView使用体验(二)
- RecycleView(二)
- 自定义recycleView(二)
- recycleView
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- recycleview
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- VS2005这么设置工作路径让找到动态库方便项目管理
- openglesForC++绘制草地
- <Android> 常用ADB调试命令
- linux服务器安装MYSQL
- openni2结构简介
- RecycleView(二)
- SPI初识
- 必备软件
- 大头小头 字节序
- Python高级数据结构之Collection
- unity学习的架构
- package包
- 选择排序的算法
- JAVA发送邮件及springboot发送邮件