BaseAdapter的getView方法中对setOnclickListener优化

在应用开发中凡是又列表式的界面我都采取使用ListView来呈现界面,并且需要一个BaseAdapter来加载数据进去,所以我们就需要重写getView方法,那么问题来了,在每一个Item都有一个按钮的话我们需要给按钮setOnclickListener,假设我们按一下代码来写的话:

ActiveClick ac = new ActiveClick();
convertView.findViewById(R.id.main).setOnClickListener(ac);

通过打印我们可以看到log日志:
这里写图片描述

每一个的Listener的地址都不一样也就是说每一项的都会有一个Listener占据着内存,这样上下滑动又是数不清的内存被占用了,就违背了ListView的复用精神了,内存开销太大了,所以我们需要往复用的方向去写,所以:

ActiveInfoClick ac;

if (null == view) {

    holder = new ViewHolder();
    .
    .   
    .

    ac = new ActiveClick();

    view.setTag(holder);

    view.setTag(R.id.info_image, imageClick);

} else {

    holder = (ViewHolder) view.getTag();

    ac = (ActiveClick) view.getTag(R.id.info_image);

}
holder.infoImage.setOnClickListener(ac);

通过上面的代码我们优先的复用了Listener,依然通过log日志查看:
这里写图片描述

由于界面的item高度比较大,所以6个需要滑动屏幕一次。可以看出来456已经复用之前的listener,也就是说Listener的个数就会跟ListView一样只会初始化一个屏幕可见的个数,虽然这种对象所占内存不大但是积少成多都是危险,在写代码的时候我们需要考虑没一点,同样是积少成多那么整个应用就在一定程度上达到唯美。

要在BaseAdapter实现点击事件,可以在getView()方法为每个item设置点击事件监听器。具体步骤如下: 1. 在getView()方法获取当前item的View对象。 2. 为View对象设置点击事件监听器。 3. 在监听器处理点击事件。 代码示例: ```java public class MyAdapter extends BaseAdapter { private Context mContext; private List<String> mData; public MyAdapter(Context context, List<String> data) { mContext = context; mData = data; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false); holder = new ViewHolder(); holder.tvItem = convertView.findViewById(R.id.tv_item); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final String item = mData.get(position); holder.tvItem.setText(item); holder.tvItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 处理点击事件 Toast.makeText(mContext, "点击了" + item, Toast.LENGTH_SHORT).show(); } }); return convertView; } static class ViewHolder { TextView tvItem; } } ``` 在上面的代码,我们在getView()方法为每个item的TextView设置了点击事件监听器,并在监听器处理了点击事件。注意要使用final关键字将item变量声明为常量,以便在监听器使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值