首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多个侦听器

多个侦听器
EN

Stack Overflow用户
提问于 2015-01-31 11:22:43
回答 2查看 376关注 0票数 1

我有一个关于ListView和听众的问题。假设我的应用程序中有一个列表视图。其中的每一项都包含一个复选框。我有以下代码:

代码语言:javascript
运行
复制
public View getView(final int position, View convertView, ViewGroup parent) {

    CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox);

    checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // some code
        }               
    });

}

如您所见,每次调用getView方法时,我都会设置。那么,设置侦听器是正确的吗?还是我应该设置一次?表现不好吗?还是没什么关系?如果我多次设置侦听器,它是否会覆盖以前的侦听器,还是会为该事件设置多个侦听器?

EN

回答 2

Stack Overflow用户

发布于 2015-01-31 11:47:45

您设置的每个侦听器都将覆盖前一个监听器(如果有的话)。

设置一个侦听器或其他任何东西都会消耗大量的时间,但是这里还创建了一个新的匿名类,这将花费更长的时间。

为了最大限度地提高性能,我要做一些调整:

  1. 使用convertViews缓存视图
  2. 使用ViewHolder模式避免多次findViewById调用
  3. 对所有复选框使用单个侦听器,并仅在缓存的视图上设置它(如果是convertView == null)
  4. 将CheckBox所在项目的位置保存为复选框的标记

下面是一个例子:

代码语言:javascript
运行
复制
private static class ViewHolder {
    CheckBox checkBox;
}

private CompoundButton.OnCheckedChangeListener mCheckListener = new CompoundButton
        .OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        Log.e("TAG", "CheckBox position: " + buttonView.getTag());
    }
};

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        /* Inflate the layout here */

        holder = new ViewHolder();
        holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
        /* Find other views in you layout here */

        holder.checkBox.setOnCheckedChangeListener(mCheckListener);
        // Set the holder as tag, so you can fetch it later for re-use
        convertView.setTag(holder);
    } else {
        // Fetch the holder
        holder = (ViewHolder) convertView.getTag();
    }

    // Set the checkbox position
    holder.checkBox.setTag(position);

    return convertView;
}

如果您不熟悉使用convertViewsViewHolder模式,则应该查看解释这一切的ListView的世界

票数 2
EN

Stack Overflow用户

发布于 2015-01-31 11:29:13

表现不好吗?还是没什么关系?

这不重要。设置者只分配对象。

如果我多次设置侦听器,它是否会覆盖以前的侦听器,还是会为该事件设置多个侦听器?

在您的复选框的每个实例中,只有一个名为setOnCheckedChangeListenerListView是一个特殊的案例,因为它的循环机制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28251013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档