一.摘要
Android平台事件处理分为两种方式:一是基于回调机制,另一种是基于接口监听,刚好对应抽象类和接口。也可以说抽象类是基于回调机制的事件处理,接口是基于接口监听的事件处理,在support v7包中有一个RecyclerView的控件,RecyclrView没有提供ListView的setItemClickListener方法,方法中传入ItemClickListener接口,当ListView设置了setItemClickListener方法时,执行接口监听操作,代码执行到这一步重写OnItemClickListener的接口方法,响应选项单击事件。
- new ListView(this).setOnItemClickListener(
- new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- }
- });
接口监听的原则设置接口,然后实现接口中的方法,在实现的方法中执行各自的操作。另外一个常用的接口OnClickListener,使用同样的原理,Button控件调用了setOnClickListener方法后设置接口,实现接口的onClick方法中执行登录操作或Activity跳转操作。
- new Button(this).setOnClickListener(
- new OnClickListener(){
- @Override
- public void onClick(View v){
- Intent intent=new Intent();
- intent.setClass(MainActivity.this,SecondActivity.class);
- startActivity(intent);
- }
- });
二.自定义接口监听
为什么需要学会自定义接口监听?接口和抽象类是Android编程的核心,能够自定义接口监听方法,能够更好理解接口的含义,熟练使用接口监听进行程序设计(同时更重要阅读Android源码基本不是啥难事,啊哈)。
分析要求:现在有这么一个需求,RecyclerView在官方的文档里面没有提供OnItemClickListener的接口(刚好最近在学习RecyclerView控件),我们为RecyclerView自定义一个OnItemClickLitener接口响应选项选中操作,最终效果图:
重写RecyclerView添加setOnItemClickListener()方法和内部接口OnItemClickListener,接口声明抽象方法onItemClick(),布局文件可以使用重写的RecyclerView代替android.support.v7.widget.RecyclerView,同时我们可以使用setOnItemClickListener()方法,处理选项选中的操作,几行代码搞定:
- private void initView(){
- LinearLayoutManager manager=new LinearLayoutManager(this);
- mRecyclerView=(RecyclerView3)findViewById(R.id.recyclerview_list);
- mRecyclerView.setLayoutManager(manager);
- mRecyclerView.setAdapter(new RecyclerAdapter());
- mRecyclerView.setOnItemClickListener(new RecyclerView3.OnItemClickListener() {
- @Override
- public void onItemClick(RecyclerView.ViewHolder vh) {
- String text=( (RecyclerAdapter.ItemViewHolder)vh).tv.getText().toString();
- Toast.makeText(RecyclerView3Activity.this,"第三种方式:点击了"+text+"选项",Toast.LENGTH_SHORT).show();
- }
- });
- }
关于继承的意义:RecyclerView3继承RecycerView,可以继承父类的属性和方法,同时添加子类自己的属性和方法,扩展类的功能,这是继承的好用的地方。RecyclerView3扩展了setOnItemClickListener()方法,然后根据接口监听的事件处理,在接口的onItemClick(RecyclerView.ViewHolder vh)传入选中的选项。
- public void setOnItemClickListener(OnItemClickListener onItemClickListener){
- this.onItemClickListener=onItemClickListener;
- addOnItemTouchListener(onItemTouchListener);
- }
- protected interface OnItemClickListener {
- void onItemClick(RecyclerView.ViewHolder vh);
- }
- private RecyclerView.OnItemTouchListener onItemTouchListener=new RecyclerView.OnItemTouchListener(){
- ...
- }
onItemTouchListener是RecyclerView.OnItemTouchListener接口对象,然后实现接口的onInterceptTouchEvent(),onTouchEvent(),onRequestDisallowInterceptTouchEvent()三个抽象方法,重写的方法中处理RecyclerView触摸事件,查看官方文档可以了解这三个方法的作用:
- @Override
- ublic boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
- return false;
- }
方法一:在RecyclerView本身或其子视图处理触摸事件之前,该方法静静监视和接管发送到RecyclerView的事件消息,即对RecyclerView进行事件拦截
- @Override
- public void onTouchEvent(RecyclerView rv, MotionEvent e) {
- }
方法二:在方法一返回true,作为手势事件处理的一部分,即对RecyclerView进行触摸事件处理,获取MotionEvent对象,这一步就可以使用GestureDetectorCompat进行事件分发处理(下面详细说明)
- @Override
- public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
- }
方法三:当RecyclerView子视图不想被RecyclerView或其父类事件拦截,回调该方法
- @Override
- ublic void addOnItemTouchListener(OnItemTouchListener listener) {
- super.addOnItemTouchListener(listener);
- init();
- }
在重写的addOnItemTouchListener中初始化GestureDetectorCompat,GestureDetectorCompat属于android.support.v4.view包的类,其中一个构造方法中GestureDetectorCompat(Context context, OnGestureListener listener)传入Context对象,OnGestureListener接口,然后再重写的OnGestureListener方法事件方法对RecyclerView选项选中操作。
- private void init(){
- mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(), new GestureDetector.SimpleOnGestureListener(){
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- View child = findChildViewUnder(e.getX(), e.getY());
- if (child != null) {
- RecyclerView.ViewHolder vh = getChildViewHolder(child);
- onItemClickListener.onItemClick(vh);
- }
- return true;
- }
- });
- }
这里最关键: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选项点击的效果。看完这两篇文章,对抽象类和接口你会有质的飞跃哈。
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/1775.html ,谢谢支持!