面向抽象的编程思想之重写RecyclerView

2016-05-28 13:40 评论 0 条

一.摘要

Android平台事件处理分为两种方式:一是基于回调机制,另一种是基于接口监听,刚好对应抽象类和接口。也可以说抽象类是基于回调机制的事件处理,接口是基于接口监听的事件处理,在support v7包中有一个RecyclerView的控件,RecyclrView没有提供ListView的setItemClickListener方法,方法中传入ItemClickListener接口,当ListView设置了setItemClickListener方法时,执行接口监听操作,代码执行到这一步重写OnItemClickListener的接口方法,响应选项单击事件。

001-define-interface-abstract-class

  1. new ListView(this).setOnItemClickListener(  
  2.                 new AdapterView.OnItemClickListener() {  
  3.             @Override  
  4.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  5.                           
  6.             }  
  7.         });  

接口监听的原则设置接口,然后实现接口中的方法,在实现的方法中执行各自的操作。另外一个常用的接口OnClickListener,使用同样的原理,Button控件调用了setOnClickListener方法后设置接口,实现接口的onClick方法中执行登录操作或Activity跳转操作。

  1. new Button(this).setOnClickListener(  
  2.                 new OnClickListener(){  
  3.             @Override  
  4.         public void onClick(View v){  
  5.            Intent intent=new Intent();  
  6.                   intent.setClass(MainActivity.this,SecondActivity.class);  
  7.                 startActivity(intent);    
  8.         }  
  9. });  

二.自定义接口监听

为什么需要学会自定义接口监听?接口和抽象类是Android编程的核心,能够自定义接口监听方法,能够更好理解接口的含义,熟练使用接口监听进行程序设计(同时更重要阅读Android源码基本不是啥难事,啊哈)。

分析要求:现在有这么一个需求,RecyclerView在官方的文档里面没有提供OnItemClickListener的接口(刚好最近在学习RecyclerView控件),我们为RecyclerView自定义一个OnItemClickLitener接口响应选项选中操作,最终效果图:

recycler-onitemclicklistener-demo

重写RecyclerView添加setOnItemClickListener()方法和内部接口OnItemClickListener,接口声明抽象方法onItemClick(),布局文件可以使用重写的RecyclerView代替android.support.v7.widget.RecyclerView,同时我们可以使用setOnItemClickListener()方法,处理选项选中的操作,几行代码搞定:

  1. private void initView(){  
  2.        LinearLayoutManager manager=new LinearLayoutManager(this);  
  3.        mRecyclerView=(RecyclerView3)findViewById(R.id.recyclerview_list);  
  4.        mRecyclerView.setLayoutManager(manager);  
  5.        mRecyclerView.setAdapter(new RecyclerAdapter());  
  6.   
  7.        mRecyclerView.setOnItemClickListener(new RecyclerView3.OnItemClickListener() {  
  8.            @Override  
  9.            public void onItemClick(RecyclerView.ViewHolder vh) {  
  10.                String text=( (RecyclerAdapter.ItemViewHolder)vh).tv.getText().toString();  
  11.                Toast.makeText(RecyclerView3Activity.this,"第三种方式:点击了"+text+"选项",Toast.LENGTH_SHORT).show();  
  12.            }  
  13.        });  
  14.    }  

关于继承的意义:RecyclerView3继承RecycerView,可以继承父类的属性和方法,同时添加子类自己的属性和方法,扩展类的功能,这是继承的好用的地方。RecyclerView3扩展了setOnItemClickListener()方法,然后根据接口监听的事件处理,在接口的onItemClick(RecyclerView.ViewHolder vh)传入选中的选项。

  1. public void setOnItemClickListener(OnItemClickListener onItemClickListener){  
  2.         this.onItemClickListener=onItemClickListener;  
  3.         addOnItemTouchListener(onItemTouchListener);  
  4.     }  
  5.   
  6. protected interface OnItemClickListener {  
  7.         void onItemClick(RecyclerView.ViewHolder vh);  
  8.     }  
  9.   
  10. private RecyclerView.OnItemTouchListener onItemTouchListener=new RecyclerView.OnItemTouchListener(){  
  11.   
  12.     ...  
  13.     }  

onItemTouchListener是RecyclerView.OnItemTouchListener接口对象,然后实现接口的onInterceptTouchEvent(),onTouchEvent(),onRequestDisallowInterceptTouchEvent()三个抽象方法,重写的方法中处理RecyclerView触摸事件,查看官方文档可以了解这三个方法的作用:

  1. @Override  
  2. ublic boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {  
  3.            return false;  
  4.    }  

方法一:在RecyclerView本身或其子视图处理触摸事件之前,该方法静静监视和接管发送到RecyclerView的事件消息,即对RecyclerView进行事件拦截

  1. @Override  
  2. public void onTouchEvent(RecyclerView rv, MotionEvent e) {  
  3.   
  4.     }  

方法二:在方法一返回true,作为手势事件处理的一部分,即对RecyclerView进行触摸事件处理,获取MotionEvent对象,这一步就可以使用GestureDetectorCompat进行事件分发处理(下面详细说明)

  1. @Override  
  2. public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {  
  3.   
  4.     }  

方法三:当RecyclerView子视图不想被RecyclerView或其父类事件拦截,回调该方法

  1. @Override  
  2. ublic void addOnItemTouchListener(OnItemTouchListener listener) {  
  3.        super.addOnItemTouchListener(listener);  
  4.        init();  
  5.    }  

在重写的addOnItemTouchListener中初始化GestureDetectorCompat,GestureDetectorCompat属于android.support.v4.view包的类,其中一个构造方法中GestureDetectorCompat(Context context, OnGestureListener listener)传入Context对象,OnGestureListener接口,然后再重写的OnGestureListener方法事件方法对RecyclerView选项选中操作。

  1. private void init(){  
  2.          mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(), new GestureDetector.SimpleOnGestureListener(){  
  3.             @Override  
  4.             public boolean onSingleTapUp(MotionEvent e) {  
  5.                 View child = findChildViewUnder(e.getX(), e.getY());  
  6.                 if (child != null) {  
  7.                     RecyclerView.ViewHolder vh = getChildViewHolder(child);  
  8.                     onItemClickListener.onItemClick(vh);  
  9.                 }  
  10.                 return true;  
  11.             }  
  12.         });  
  13. }  

这里最关键:RecyclerView提供findChildViewUnder(float x, float y)方法,获取屏幕上X轴,Y轴的坐标,返回RecyclerView对应的子视图,在根据子视图获取RecyclerView.ViewHolder对象,使用RecyclerView提供的getChildViewHolder(View view)方法,最后将RecyclerView.ViewHolder对象传入自定义的接口方法中onItemClick(RecyclerView.ViewHolder vh),最后完成RecyclerView自定义接口,感觉还行吧。

三.自定义抽象类

这一篇文章的目的介绍抽象类和接口的使用,最后涉及到了android.support.v7.widget包下的RecycylerView的使用,自定义View,GestureDetectorCompat手势探测器等一系列新东西,篇幅可能有点大了,自定义抽象类决定在下一篇文章中继续介绍,内容是如何将上述RecyclerView自定义接口改为自定义抽象类的形式,实现RecyclerView选项点击的效果。看完这两篇文章,对抽象类和接口你会有质的飞跃哈。

当前文章价值6.96元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://www.teachcourse.cn/1775.html ,谢谢支持!

资源分享

分类:Java基础 标签:
如何快速的搭建自己的第一个网站? 如何快速的搭建自己的第一个网站
python编辑以发布wordpress文章 python编辑以发布wordpress文章
Activity四种启动模式 Activity四种启动模式
静态注册广播检查网络状态 静态注册广播检查网络状态