美文网首页
RecyclerView加点击事件(二)

RecyclerView加点击事件(二)

作者: 难得糊涂与君勉 | 来源:发表于2017-03-09 17:57 被阅读121次

前言

由于RecyclerView里面没有提供条目的点击事件,这里进行了添加,如果想看RecyclerView的基础使用可以参考:
RecyclerView(一)
RecyclerView的滑动监听(三)
RecyclerView之横向展示(四)
RecyclerView之瀑布流(五)
RecyclerView优化

实现

第一步
采用接口回调的方式来实现,先准备一个接口,放在自定义的Adapter文件里面,不用当做内部类的形式


interface sendListener{
         void send(int positon);
}
这里只用position当做参数,是为了 演示,具体可以根据自己的需求来提供不同的参数

第二步
让适配器持有这个自定义接口的对象,并且对外暴露

    private sendListener sendListener; //持有这个接口的对象

    public void setSendListener(com.yuyi.myrecyclerstudy.sendListener sendListener) {
        this.sendListener = sendListener;
    }//对外暴露规则

第三步
在自定义的ViewHolder里面完成调用

 public class MyViewHodler extends RecyclerView.ViewHolder{
      
             TextView name,time;//定义的两个变量

            //必须要重写其构造方法,发现参数是View,可以认为是每一个条目的View(视图)
           //可以认为是第二步
        public MyViewHodler(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.textview_name);
            time = (TextView) itemView.findViewById(R.id.textview_time);
            //在这里得到了视图,因此在这里对于视图进行加点击事件
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (sendListener != null){
                        sendListener.send(getLayoutPosition());
                      //通过getLayoutPosition得到其位置,这个是关键。这里对于这个条目进行添加点击事件
                    }
                }
            });      //另外这里是对于itemView加的点击事件,如果情况特殊完全可以只对于某个View加上点击事件。
        }
    }

第四步
在外界就可以使用其点击事件了

liAdater.setSendListener(new sendListener() {
            @Override
            public void send(final int positon) {
                Toast.makeText(MainActivity.this,""+positon,Toast.LENGTH_SHORT).show();
               }
}
效果如图:
device-2017-03-09-112305.png

总结

原本这样,RecyclerView已经具有点击事件了,可以满足正常的需求了,但是RecyclerView本身提供了
很大的自由性和一些动画,这里就顺便演示某些动画效果

补充一
在自定义的Adapter类中加上,增添一个条目和删除一个条目的对外的方法

    //针对于带有动画的删除一个item
    public void removeItem(int position){
        list.remove(position);
        notifyItemRemoved(position);
    }
    //针对与带有动画的增加一个item
    public void addItem(int position,beans1 b){
        list.add(position,b);//先改变数据源
        notifyItemInserted(position);
    }

补充二
在点击事件处理时候加上AlertDialog 进行处理,完成效果:

liAdater.setSendListener(new sendListener() {
            @Override
            public void send(final int positon) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.mipmap.ic_launcher);
                builder.setTitle("请选择你的操作");

                builder.setNegativeButton("删除", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        liAdater.removeItem(positon);
                    }
                });

                builder.setPositiveButton("增加", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        beans1 b = new beans1();
                        b.setTime("99");
                        b.setName("新");
                        liAdater.addItem(positon,b);
                    }
                });

                builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialogInterface) {
                        Toast.makeText(MainActivity.this,"用户取消了操作",Toast.LENGTH_SHORT).show();
                    }
                });
                builder.show();
            }
        });
效果如图:
device-2017-03-09-113239_20170309175536.gif

相关文章

网友评论

      本文标题:RecyclerView加点击事件(二)

      本文链接:https://www.haomeiwen.com/subject/qecggttx.html