ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看直播体育app软件下载 >> Android开发 >> android开发游记:RecyclerView无法添加onItemClickListener最佳的高效解决方案

android开发游记:RecyclerView无法添加onItemClickListener最佳的高效解决方案(1/3)

来源:网络整理     时间:2016-05-28     关键词:

本篇文章主要介绍了"android开发游记:RecyclerView无法添加onItemClickListener最佳的高效解决方案",主要涉及到方面的内容,对于Android开发感兴趣的同学可以参考一下: 【转自:http://blog.csdn.net/liaoinstan/article/details/51200600】 自从RecyclerView发布以...

【转自:http://blog.csdn.net/liaoinstan/article/details/51200600】
自从RecyclerView发布以来,由于其高度的可交互性被广泛使用。但是RecyclerView确没有像ListView一样提供onItemClickListener却让人比较难过,网上搜索了一番有不少解决方案,但是其本质都是通过给每个item添加onClickListener来模仿一个伪onItemClickListener,这种为每个item添加点击监听的解决方案不用多想也知道是浪费性能的方法。能不能像ListView那样使用一个监听解决问题呢?

查阅RecyclerView的api发现虽然没有提供onItemClickListener但是提供了addOnItemTouchListener方法:

RecyclerView.addOnItemTouchListener(OnItemTouchListener listener)

既然可以添加触摸监听,那么我们完全可以获取触摸手势来识别点击事件,然后通过触摸坐标来判断点击的是哪一个item,虽然听起来比较复杂,但是sdk 的 api已经为我们实现了大部分方法,我们只需要实现接口几行代码就可以搞定了。

下面先说一下使用方法,后面详细介绍其实现原理:

如何使用

recyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(recyclerView) {
      @OverridepublicvoidonItemClick(RecyclerView.ViewHolder vh) {
        //item点击事件
      }
});

其中OnRecyclerItemClickListener是自定义的一个触摸监听器,代码如下:
仅有短短十多行代码,sdk已经为我们实现了大部分功能

publicabstractclassOnRecyclerItemClickListenerimplementsRecyclerView.OnItemTouchListener{private GestureDetectorCompat mGestureDetector;
    private RecyclerView recyclerView;

    publicOnRecyclerItemClickListener(RecyclerView recyclerView){
        this.recyclerView = recyclerView;
        mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchHelperGestureListener());
    }

    @OverridepublicbooleanonInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
        returnfalse;
    }

    @OverridepublicvoidonTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
    }

    @OverridepublicvoidonRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }

    privateclassItemTouchHelperGestureListenerextendsGestureDetector.SimpleOnGestureListener {@OverridepublicbooleanonSingleTapUp(MotionEvent e) {
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child!=null) {
                RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);
                onItemClick(vh);
            }
            returntrue;
        }

        //长点击事件,本例不需要不处理//@Override//public void onLongPress(MotionEvent e) {//    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());//    if (child!=null) {//        RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);//        onItemLongClick(vh);//    }//}publicabstractvoidonItemClick(RecyclerView.ViewHolder vh);
  //public abstract void onItemLongClick(RecyclerView.ViewHolder vh);
}

以上就是全部的代码了,看起来很少,其实包含的内容还是比较多的,下面详细剖析下其实现原理:

实现原理

查阅api发现,RecyclerView提供了设置触摸监听的方法,那么我们定义一个类OnRecyclerItemClickListener实现OnItemTouchListener,我们需要实现其3个方法:

相关图片

相关文章