博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 关于ListView中按钮监听的优化问题(方法一)
阅读量:4138 次
发布时间:2019-05-25

本文共 2357 字,大约阅读时间需要 7 分钟。

在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     @Override10     public void onClick(View view) {11         //TODO: do something here12     }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 @Override3 public void onClick(View v) {4     int position = (Integer) ((Button) v).getTag();5     // ...6 }

附上item_list.xml文件的代码:

1 
2
6
11

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

 

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

 

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

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

转载地址:http://erovi.baihongyu.com/

你可能感兴趣的文章
第三方SDK:百度地图SDK的使用
查看>>
Android studio_迁移Eclipse项目到Android studio
查看>>
JavaScript setTimeout() clearTimeout() 方法
查看>>
CSS border 属性及用border画各种图形
查看>>
转载知乎-前端汇总资源
查看>>
JavaScript substr() 方法
查看>>
JavaScript slice() 方法
查看>>
JavaScript substring() 方法
查看>>
HTML 5 新的表单元素 datalist keygen output
查看>>
(转载)正确理解cookie和session机制原理
查看>>
jQuery ajax - ajax() 方法
查看>>
将有序数组转换为平衡二叉搜索树
查看>>
最长递增子序列
查看>>
从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小...
查看>>
判断一个整数是否是回文数
查看>>
经典shell面试题整理
查看>>
腾讯的一道面试题—不用除法求数字乘积
查看>>
素数算法
查看>>
java多线程环境单例模式实现详解
查看>>
将一个数插入到有序的数列中,插入后的数列仍然有序
查看>>