Android 为Recyclerview添加滚动监听事件,以及为它每一个item设置点击监听事件

虽然recyclerview为 整个recyclerview设置了一些监听事件,但是没有自带为其中的item设置点击事件

本文将提供一种recyclerview中item的点击监听事件的实现方法
先看看效果图:
这里写图片描述

第一,你需要一个接口

public interface OnItemClickListener {
        void OnItemclick(View view,int position);
}

第二,再适配器中 声明一个该接口的引用

public class Adapter extends RecyclerView.Adapter<ViewHolderr> {
    private LayoutInflater layoutInflater;
    private Context context;
    private String[] datas;
    private OnItemClickListener onItemClickListener;//声明一个接口的引用

    public Adapter(Context context, String[] datas) {//构造函数传入Context对象和数据源
        this.layoutInflater=LayoutInflater.from(context);
        this.context = context;
        this.datas = datas;
    }

    @Override
    public ViewHolderr onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=layoutInflater.inflate(R.layout.item,parent,false);
        ViewHolderr viewHolderr=new ViewHolderr(view);
        return viewHolderr;
    }


    @Override
    public void onBindViewHolder(final ViewHolderr holder, int position) {
        holder.getButton().setText(datas[position]);
        //在该函数中为recyclerview的视图绑定监听事件
        if (onItemClickListener != null) {
            holder.getButton().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                  onItemClickListener.OnItemclick(holder.itemView, holder.getLayoutPosition());
                }
            });
        }
    }
    @Override
    public int getItemCount() {
        return datas.length;
    }
    public  void setOnItemClickListner(OnItemClickListener onItemClickListner){
        this.onItemClickListener=onItemClickListner;
    }
}

第三,就是在Mainactivity中给recyclerview设置监听事件了:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        final LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        recyclerview.setLayoutManager(linearLayoutManager);
        Adapter adapterr=new Adapter(this,datas);
        adapterr.setOnItemClickListner(new OnItemClickListener() {
            @Override
            public void OnItemclick(View view, int position) {
                Toast.makeText(MainActivity.this,  datas[position], Toast.LENGTH_SHORT).show();
            }
        });
        recyclerview.setAdapter(adapterr);
        recyclerview.setHasFixedSize(true);
        recyclerview.setItemAnimator(new DefaultItemAnimator());

    }

以下是对整个recycler的监听事件(来自https://developer.android.com/

 recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
            //返回当前recyclerview的可见的item数目,也就是datas.length
            //dx是水平滚动的距离,dy是垂直滚动距离,向上滚动的时候为正,向下滚动的时候为负
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int firstVisibleItemPosition=linearLayoutManager.findFirstVisibleItemPosition();//可见范围内的第一项的位置
                int lastVisibleItemPosition=linearLayoutManager.findLastVisibleItemPosition();//可见范围内的最后一项的位置
                int itemCount=linearLayoutManager.getItemCount();//recyclerview中的item的所有的数目

                //System.out.println(linearLayoutManager.getItemCount());
                System.err.println(dy);
            }
        });
        recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                /*
                new State
                0(SCROLL_STATE_IDLE)表示recyclerview是不动的(The RecyclerView is not currently scrolling.)
                1(SCROLL_STATE_DRAGGING)表示recyclerview正在被拖拽(The RecyclerView is currently being dragged by outside input such as user touch input.)
                2(SCROLL_STATE_SETTLING)表示recyclerview正在惯性下滚动(The RecyclerView is currently animating to a final position while not under outside control.)
                 */
                switch(newState)
                {
                    case 0:
                        System.out.println("recyclerview已经停止滚动");
                        break;
                    case 1:
                        System.out.println("recyclerview正在被拖拽");
                        break;
                    case 2:
                        System.out.println("recyclerview正在依靠惯性滚动");
                        break;
                }
            }
        });

Demo源码已经上传到github.com,需要的朋友请戳https://github.com/Gpwner/Recyclerview/tree/master

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值