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());





0 0