首页技术onclicklistener接口(triggerout接口连接线)

onclicklistener接口(triggerout接口连接线)

编程之家2026-06-29834次浏览

大家好,关于onclicklistener接口很多朋友都还不太明白,今天小编就来为大家分享关于triggerout接口连接线的知识,希望对各位有所帮助!

onclicklistener接口(triggerout接口连接线)

RecyclerView的点击事件处理求教

RecyclerView本身并没有提供用于监听Item点击、长按等事件的方法,需要我们自己实现来进行监听。

通常实现监听的方法有两种:

通过在Adapter中设置监听回调来处理点击逻辑

通过设置RecyclerView.addOnItemTouchListener,并重写RecyclerView.OnItemTouchListener来实现

在Adapter中设置回调

实现逻辑跟我们平常设置监听回调的逻辑并无差别:

onclicklistener接口(triggerout接口连接线)

1.定义一个MyClickListener接口,并定义onClick()、onLongClick()等回调方法

2.在Adapter中定义一个MyClickListener对象,并提供设置方法setOnMyClickListener或者在构造方法中指定MyClickListener对象参数

3.在Adapter的onBindViewHolder中给View设置监听setOnclickListener和setOnLongClickLister等

4.Activity中进行回调,处理点击逻辑

代码:

public MyRecyclerViewAdapter(Context mContext, List<Integer> datas, MyOnClickListeneronClickListener){

onclicklistener接口(triggerout接口连接线)

this.mContext= mContext;

this.datas= datas;

this.onClickListener= onClickListener;

}

public void setOnclickListener(MyOnClickListener onClickListener){

this.onClickListener= onClickListener;

}

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position){

((MyViewHolder)holder).mImageView.setImageResource(datas.get(position));

((MyViewHolder)holder).rootView.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v){

if(onClickListener!= null){

onClickListener.onClick(v, position);

}

}

});

((MyViewHolder)holder).rootView.setOnLongClickListener(new View.OnLongClickListener(){

@Override

public boolean onLongClick(View v){

if(onClickListener!= null){

onClickListener.onLongClick(v, position);

}

return true;

}

});

}

/**

*点击监听接口

*/

public interface MyOnClickListener{

void onClick(View view, int position);

void onLongClick(View view, int position);

}

在Activity中:

vRecyclerView.setAdapter(new MyRecyclerViewAdapter(this, datas, new MyOnClickListener(){

@Override

public void onClick(Viewview, int position){

//点击

}

@Override

public void onLongClick(Viewview, int position){

//长按

}

}));

这种实现方式的突出有点就是简单明了,易于实现。但是这种实现方式首先违背了但一直责原则,再者其与Adapter高度耦合的特点也决定了他的复用性比较低。比如:现在有多个不同的RecyclerView,那么就需要在每个Adapter中都实现监听回调,无疑增加了代码的冗余度。

通过addOnItemTouchListener实现点击监听

RecyclerView虽然没有提供Item的监听方法,但还是提供了addOnItemTouchListener(OnItemTouchListenerlistener)监听Touch事件的方法,通过实现OnItemClickListener接口来实现监听。在实现过程中我们使用了手势监听类:GestureDetector(参考另一篇)。

OnItemTouchListener接口中一共有三个方法:

onInterceptTouchEvent

onTouchEvent

onRequestDisallowInterceptTouchEvent

学习过事件分发机制的同学,对这三个方法会比较熟悉,简单来说onInterceptTouchEvent对事件进行拦截,如果这个方法返回True,那么TouchEvent将会交给onTouchEvent处理(当然了你想在onInterceptTouchEvent中处理事件也没毛病),如果返回false,TouchEvent将传递到下层View处理。

显然我们需要拦截事件onInterceptTouchEvent返回true,然后处理事件

@Override

public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e){

if(mGestureDetector.onTouchEvent(e)){

return true;

} else{

return false;

}

}

@Override

public void onTouchEvent(RecyclerView rv, MotionEvent e){

}

@Override

public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept){

}

对于事件处理就需要GestureDetector出场了,GestureDetector是专门用于手势处理的类。

mGestureDetector= new GestureDetector(mContext, new GestureDetector.SimpleOnGestureListener(){

@Override

public void onLongPress(MotionEvente){

if(listener!= null){

View view= mRecyclerView.findChildViewUnder(e.getX(), e.getY());

listener.OnLongClick(view, mRecyclerView.getChildLayoutPosition(view));

}

}

@Override

public boolean onSingleTapUp(MotionEvent e){

if(listener!= null){

View view= mRecyclerView.findChildViewUnder(e.getX(), e.getY());

listener.onClick(view, mRecyclerView.getChildLayoutPosition(view));

return true;

} else{

return false;

}

}

});

哦~对了,还需要在Activity中进行回调,实现方式同上面方法一,定义MyClickListener接口,添加set方法或者在构造方法中添加MyClickListener参数,在activity中实现回调。

vRecyclerView.addOnItemTouchListener(new MyOnItemTouchListener(LinearLayoutManagerActivity.this, vRecyclerView, new MyOnItemTouchListener.OnItemClickListener(){

@Override

public void onClick(Viewview, int position){

Toast.makeText(LinearLayoutManagerActivity.this,"onClick:"+ position, Toast.LENGTH_SHORT).show();

}

@Override

public void OnLongClick(Viewview, int position){

Toast.makeText(LinearLayoutManagerActivity.this,"onLongClick:"+ position, Toast.LENGTH_SHORT).show();

}

}));

对于复杂手势,比如滑动删除、滑动显示按钮了GestureDetector是干不了的,只能在onTouchEvent中自己写逻辑实现了。

...所有的按钮onClickListener监听失效,是怎么回事

在Android开发过程中,如果从主界面点击按钮跳转到另一个Activity后,所有按钮的onClickListener监听失效,这通常是由于触摸事件处理机制的冲突导致的。

具体来说,setOnTouchListener会监控从按下到释放的整个触摸过程,它的回调函数是onTouchEvent,通过判断event.getAction()是ACTION_UP、ACTION_DOWN还是ACTION_MOVE来决定不同行为。而setOnClickListener只监控到ACTION_DOWN时的行为。

解决此类问题的方法有两个:

1.可以直接在onTouchEvent的ACTION_DOWN事件中处理点击按钮的行为,替代使用setOnClickListener。

2.使用信号量机制,即通过变量来控制某些代码在特定条件下执行,而非其他条件。这通常通过if/switch语句实现。

使用信号量方法时,可以设置一个布尔变量,例如isButtonClickable,在特定情况下设置为false,以阻止onClickListener的执行。这样可以在onTouchEvent中根据实际情况更新这个变量,从而控制按钮的点击行为。

总结来说,通过调整触摸事件处理逻辑或使用信号量机制,可以有效解决按钮监听失效的问题。

RecyclerView小结

目录

​ 1. RecyclerView与ListView的异同

​ 2. RecyclerView的使用

​-简单使用步骤

​-关于Item点击事件的监听

​-关于滚动事件的监听

​-设置Decoration

​-设置Animation

RecyclerView和ListView一样是用于展示大量数据集的部件,两者都能够回收和复用不可见的view来节约资源提高性能。与ListView不同的是,RecyclerView具有更好的灵活性,这主要得益于其插件化和充分解耦的设计:

RecyclerView与ListView的主要差异:

使用RecyclerView时一般会用到一下几个RecyclerView的内部类:

一种简单的方式就是在 onBindViewHolder时调用view的 setOnClickListener()方法;或者定义ViewHolder时让其操作 OnClickListener接口:

如果需要在activity或者fragment中处理点击事件,则可以在adapter中设计一个接口供外部调用:

在activity或fragment中使用:

RecyclerView的滚动事件可以使用 addOnScrollListener方法监听:

滚动的过程一般分为2种:

对应到 onScrollStateChanged中的newState值:

所以上面 onScrollStateChanged中的条件可以翻译为:滚动停止&&倒数第二个item已经可见&&不在加载过程中

onScrolled中dx和dy的含义:

google提供了一个RecyclerView.ItemDecoration的实现类DividerItemDecoration作为默认的divider,使用方法如下:

DividerItemDecoration的码源

DividerItemDecoration实现主要包括三个方法:

其绘制过程大致为:

在最新版的DividerItemDecoration中还提供了一个 setDrawable(Drawable drawable)方法,方便我们自己定制divider的样式。比如我在 res/drawable目录下新建一个 divider_drawable.xml文件:

然后在构造decoration时用这个文件替换默认的divider资源文件:

替换后效果如下:

可以看到由于默认的 getItemOffsets()设定了bottom的padding值,所以在divider的左右两边露出了RecyclerView下面一层的背景色。对于这种情况,可以仿造默认的DividerItemDecoration自己继承RecyclerView.ItemDecoration实现一个decoration,将绘制方法改为 onDrawOver(),并在 getItemOffsets()中不设置padding值,就可以让divider绘制在item的上方。

当然设置divider还有一种更简单的方法,直接在item的布局文件中添加一个ImageView画一条线就好了( ̄Д ̄)ノ

同样的google也提供了一个默认的动画DefaultItemAnimation,可以使用 setItemAnimation()方法来设置。

我们也可以继承RecyclerView.ItemAnimation来自己定义item动画。这里推荐一个第三方动画库 recyclerview-animatiors,简单好用可拓展。

RecyclerView整体理解和使用

点击事件

滚动事件

完整项目在我的github上,如果碰巧能帮到您不妨去点个star吧( ̄∇ ̄)

如果你还想了解更多这方面的信息,记得收藏关注本站。

html表单生成器?html表单数据验证under(undergo)