关于ListView中按钮监听的优化问题(方法一)

在Android应用开发过程中经常会用到ListView,并且每次在item中都要对点击事件进行监听。在给按钮添加OnClickListener时,一般会下意识的在getView()中找到每一个Button并new一个OnClickListener分配给这个Button,并将position赋给这个Button的监听事件。但是当数据量很大时new出这么多的监听器势必会对内存添加压力。然而每个Listener的功能完全一样,Listener里面所需要知道的只是一个position而已。那么怎样更好的利用内存呢?

既然每个Listener的功能一样,那么完全可以用单例模式构造一个Listener。如下所示:

 1 class MyOnClickListener implements View.OnClickListener {
 2     private static MyOnClickListener instance = null;
 3     private MyOnClickListener() {}
 4     public static MyOnClickListener getInstance() {
 5         if (instance == null)
 6             instance = new MyOnClickListener();
 7         return instance;
 8     }
 9     @Override
10     public void onClick(View view) {
11         //TODO: do something here
12     }
13 }

而在getView()方法中,获取到button实例之后,只需要通过button.setOnclickListener(MyOnClickListener.getInstance());对按钮社会自监听。这样的话每个按钮必然用的是同一个Listener对象。

但是我们需要的不仅如此,很多时候我们还需啊哟知道具体是哪个position的Button被点击了,我们需要根据position在Listener里面做出不一样的事情。

想要在Listener内部了解外部控件的属性,我们首先想到的是传参,但是由于我们的Listener使用的是单利模式,每个按钮忘Listener里面传的参数必然会覆盖前一个按钮传来的参数。于是我们的解决方案只剩下一种,那就是通过onClick函数的参数(View view)来获取该信息,也就是Button了。我们可以将position信息存储到Button中的Tag中,利用button.setTag(position);

那么接下来就是在Adapter中的getView方法中做相应的操作了:

 1 // ...
 2 @Override
 3 public View getView(int position, View converView, ViewGroup parentView) {
 4         Handler handler = null;
 5         View view = convertView;
 6         if(convertView == null) {
 7             view = LayoutInflater.from(activity).inflate(R.layout.item_list, null);
 8             handler= new Handler();
 9             handler.button = view.findViewById(R.id.item_list_btn);
10             view.setTag(handler);
11         } else {
12             handler = (Handler) view.getTag();
13         }
14         // ...
15         handler.button.setTag(position);
16         handler.button.setOnclickListener(MyOnClickListener.getInstance());
17         return view;
18     }
19 }
20 class Handler {
21     Button button;
22 }

最后在MyOnClickListener中的onClick方法中添加点击事件即可:

1 // ...
2 @Override
3 public void onClick(View v) {
4     int position = (Integer) ((Button) v).getTag();
5     // ...
6 }

附上item_list.xml文件的代码:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout
 3    xmlns:android="http://schemas.android.com/apk/res/android"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent" >
 6     <Button
 7         android:id="@+id/item_list_btn"
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10      android:text="点击" />
11 </RelativeLayout>

这样我们就实现了使用一个Listener对ListView中不同Item的按钮事件监听进行处理。如果还想传递出position等其他数据时,则需要自定义Button类,再在我们自定义的Button中添加我们需要的参数方法。

---------------------------------------------------

欢迎每位访客提出宝贵的意见。

时间: 2024-10-05 10:45:11

关于ListView中按钮监听的优化问题(方法一)的相关文章

ListView中按钮监听器 设置 及 优化

在应用开发中经常会用到ListView,并且每一个Item里面都会有按钮之类的需要进行事件监听的控件.在给按钮添加OnClickListener的时候,一开始很下意识的会想在ListView的adapter的getView方法中找到每个Button并new一个OnClickListener分配给这个button. 但是当数据量很大的时候,new出来这么多个监听器势必会对内存造成一定的压力,而且每个Listener的功能完全一样,Listener里面所需知道的,不过是调用者所在的Item的inde

Android中ListView的item按钮监听错乱问题解决办法

在开发中经常会遇到这样的问题,做了一个列表,给列表的每一项添加了按钮监听事件,但是在列表的数据很多的时候经常会出现点击后错乱的问题.对于这种问题,我们在程序中可能都有自己的解决办法,但是你也许第一次发现这个问题的时候会跟我之前一样手足无措. 那么现在我们可以分析一下这种问题的根本原因. 首先,我们来看一下一个出错的BaseAdapter. package com.example.listdelectdemo; import java.util.ArrayList; import android.

android listview的item布局中含有button,不会响应listview的onitemclick监听 以及 onitemlongclick监听问题解决

效果图: activity的布局xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&qu

&#8203;Java中使用for循环对多个Jbutton按钮监听

Java中Jbutton按钮监听,当多个按钮做的事差不多的时候是可以用for循环的(比如计算器1-9)省事省力. 监听时变量只能是final或者static,不过这些在for循环中明显不行,所以,就在循环里加了个final变量. 嘿嘿,轻松搞定. package com.xinbo; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.

Android开发系列(十四):ListView用法、对ListView监听的三种方法以及ListView中Adapter的使用方法

一.ArrayAdapter的介绍以及ListView的用法: Adapter是数据和视图之间的桥梁,数据在adapter中做处理,然后显示到视图上面.就是用来绑定数据用的. 用一个小例子来介绍一下: public class FriendActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCrea

Android耳机线控详解,蓝牙耳机按钮监听(仿酷狗线控效果)

转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后,Android系统会发出一个广播,该广播的携带者一个Action名为MEDIA_BUTTON的Intent.监听该广播便可以获取手机的耳机媒体按键的单击事件. 在Android中有个AudioManager类,该类会维护MEDIA_BUTTON广播的分发,所以要实现耳机按键监听需要向AudioManager注册一个用于接收耳机按键单击

[安卓] 1、页面跳转+按钮监听

共2个layout:main.xml和other.xml;2个activity:MainActivity.java,OtherActivity.java 在mainactivity中重写onCreate,第6行设置按钮监听~ 1 public void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.main); 4 Log.v("MainA

Java接口回调实现按钮监听

做Android开发的时候,经常碰到View的事件监听,虽然一直在用,但从未思考它的实现原理.还有回调函数虽然经常听说,但是总感觉很晕,一想脑袋就开始乱了.所以今天就写点东西来理一下思路. 回调函数 以下是维基百科上的定义: 在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 光看定义可能晦涩难懂,下面还是回到标题,用

Swift中KVO(监听)的使用方法及注意事项

---恢复内容开始--- 相信研究swift语言的开发者都多多少少了解或者精通Objective—C语言,熟练掌握Objective—C语言的开发者,在学习swift语言的过程中,是比较快速,而又轻松的.本人就是一位熟练掌握OC语言,后开始研究的swift.在学习swift语言的过程中,笔者建议有OC基础的开发者,在写swift的代码过程中,再写一下OC中的代码,二者相互比较,相信你能找到快速学会swift语言的方法.资深,有耐心和有天赋的开发者,相信能在一周左右,能够运用swift开发项目.其