RecyclerView的Itme多布局与Itme的点击事件

来源:互联网 发布:js获取对象的key 编辑:程序博客网 时间:2024/06/05 19:25

1.RecyclerView的Itme多布局

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{    private List<String> list;    private Context context;    private int typecount=2;    private LayoutInflater mLayoutInflater;    public MyAdapter(Context con,List<String> li){        list=li;        context=con;        mLayoutInflater = LayoutInflater.from(context);    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//        if(viewType==1){//            return new ItmeType1(mLayoutInflater.inflate(R.layout.itme1,parent,false));//        }else {//            return new ItmeType2(mLayoutInflater.inflate(R.layout.itme2,parent,false));//        }        RecyclerView.ViewHolder viewholder = null;        switch (viewType){            case 1:                viewholder=new ItmeType1(LayoutInflater.from(context).inflate(R.layout.itme1,parent,false));                break;            case 2:                viewholder=new ItmeType2(LayoutInflater.from(context).inflate(R.layout.itme2,parent,false));                break;        }        return viewholder;    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if(holder instanceof ItmeType1){    ((ItmeType1) holder).tv1.setText(list.get(position));}else if(holder instanceof ItmeType2){    ((ItmeType2) holder).tv2.setText(list.get(position));}    }    @Override    public int getItemCount() {        return list.size();    }    @Override    public int getItemViewType(int position) {        return position % 2 == 0 ? 1:2;    }    public class ItmeType1 extends RecyclerView.ViewHolder{        TextView tv1;        public ItmeType1(View itemView) {        super(itemView);            tv1=(TextView) itemView.findViewById(R.id.tv1_itme);    }}    public class ItmeType2 extends RecyclerView.ViewHolder{        TextView tv2;        public ItmeType2(View itemView) {            super(itemView);            tv2=(TextView)itemView.findViewById(R.id.tv2_itme);        }    }}
2.RecyclerView的Itme点击事件
a.通过recyclerView.addOnItemTouchListener()方法
tip one:
public class ItmeClickListener extends RecyclerView.SimpleOnItemTouchListener{private OnItmeClickListener monitmeclicklistener;    private RecyclerView recyclerView;    private GestureDetectorCompat gestureDetectorCompat;   //手势回调类   
 public interface OnItmeClickListener{        public void ItmeClick(View view,int postion);      //itme点击事件        public void ItmeLongClick(View view,int postion);   //itme长按事件    }    public ItmeClickListener(final RecyclerView recyclerView, final OnItmeClickListener onItmeClickListener){        this.recyclerView=recyclerView;        this.monitmeclicklistener=onItmeClickListener;        gestureDetectorCompat=new GestureDetectorCompat(recyclerView.getContext(),new GestureDetector.SimpleOnGestureListener(){    @Override    public boolean onSingleTapUp(MotionEvent e) {        View view=recyclerView.findChildViewUnder(e.getX(),e.getY());        if(view!=null&&monitmeclicklistener!=null){            monitmeclicklistener.ItmeClick(view,recyclerView.getChildAdapterPosition(view));        }        return true;    }    @Override    public void onLongPress(MotionEvent e) {        View view=recyclerView.findChildViewUnder(e.getX(),e.getY());        if(view!=null&&monitmeclicklistener!=null){            monitmeclicklistener.ItmeLongClick(view,recyclerView.getChildAdapterPosition(view));        }    }});    }    @Override    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {        gestureDetectorCompat.onTouchEvent(e);        return false;    }}tip two:
recyclerView.addOnItemTouchListener(new ItmeClickListener(recyclerView, new ItmeClickListener.OnItmeClickListener() {            @Override            public void ItmeClick(View view, int postion) {                    TextView tv=(TextView) view.findViewById(R.id.tv1_itme);                    Toast.makeText(MainActivity.this,"点击aa:"+postion+" / "+tv.getText(),Toast.LENGTH_SHORT).show();            }            @Override            public void ItmeLongClick(View view, int postion) {                    TextView tv=(TextView) view.findViewById(R.id.tv2_itme);                    Toast.makeText(MainActivity.this,"长按bb:"+postion+" / "+tv.getText(),Toast.LENGTH_SHORT).show();                          }        }));

b.在Adapter类中写监听接口,通过View.OnClickListener写监听事件
tip one:
public class OtherAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    private Context context;    private String[] strings;    private MyItmeClickListener myItmeClickListener;     public OtherAdapter(Context context, String[] strings){         this.context=context;         this.strings=strings;     }    public interface MyItmeClickListener{        public void myTvClick(View view,int postion);        public void myTvandCbClick(View view,int postion);    }    public void setItmeClickListeber(MyItmeClickListener myItmeClickListener ){        this.myItmeClickListener=myItmeClickListener;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if(viewType==1){            View view= LayoutInflater.from(context).inflate(R.layout.other_itme1,parent,false);            return new TvViewHolder(view);        }else {            View view=LayoutInflater.from(context).inflate(R.layout.other_itme2,parent,false);            return new TvandCbViewHolder(view);        }    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        if(holder instanceof TvViewHolder){           ((TvViewHolder) holder).tv.setText(strings[position]+"one");        }else if(holder instanceof  TvandCbViewHolder) {            ((TvandCbViewHolder) holder).tv.setText(strings[position]+"two");        }    }    @Override    public int getItemCount() {        return strings.length;    }    @Override    public int getItemViewType(int position) {        return (position)%2==0?1:2;    }    public class TvViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{        TextView tv;        public TvViewHolder(View itemView) {            super(itemView);            tv=(TextView) itemView.findViewById(R.id.other_itme1_tv);            tv.setOnClickListener(this);        }        @Override        public void onClick(View v) {            if(myItmeClickListener!=null){                myItmeClickListener.myTvClick(itemView,getAdapterPosition());            }        }    }    public class TvandCbViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{        TextView tv;        CheckBox cb;        public TvandCbViewHolder(View itemView) {            super(itemView);            tv=(TextView) itemView.findViewById(R.id.other_itme2_tv);            cb=(CheckBox)itemView.findViewById(R.id.otner_itme2_cb);            tv.setOnClickListener(this);            tv.setOnLongClickListener(this);        }        @Override        public void onClick(View v) {            if(myItmeClickListener!=null){                myItmeClickListener.myTvandCbClick(itemView,getAdapterPosition());            }        }        @Override        public boolean onLongClick(View v) {            if(myItmeClickListener!=null){                myItmeClickListener.myTvandCbClick(itemView,getAdapterPosition());            }            return true;        }    }}
tip two:
在Activity中调用
adapter.setItmeClickListeber(new OtherAdapter.MyItmeClickListener() {    @Override    public void myTvClick(View view, int postion) {        TextView tv=(TextView) view.findViewById(R.id.other_itme1_tv);        Toast.makeText(OtherClickActivity.this,"纯文本布局:"+tv.getText()+"num:"+postion,Toast.LENGTH_SHORT).show();    }    @Override    public void myTvandCbClick(View view, int postion) {        TextView textView=(TextView) view.findViewById(R.id.other_itme2_tv);        Toast.makeText(OtherClickActivity.this,"文本加复选框布局:"+textView.getText()+"num:"+postion,Toast.LENGTH_SHORT).show();    }});

0 0