繁体   English   中英

如何删除自定义侦听器?

[英]How to remove custom listeners?

我的应用程序中有许多ListActivity类,它们的行为几乎相同:列表的左侧是属性( TextView ),右侧是值( Button )。 当我按下按钮时,我想要执行类似创建对话框的操作。 由于可重复性,我决定创建一个通用的自定义ArrayAdapter如下所示:

public class GeneralTvBtnAdapter extends ArrayAdapter<SettingsProperty> {

private Context mContext;
private ArrayList<SettingsProperty> mProps;
private int mLayout;
private ButtonListener mListener;

public GeneralTvBtnAdapter(Context context, int tv_btn_layout, ArrayList<SettingsProperty> objects, ButtonListener listener) {
    super(context, tv_btn_layout, objects);
    mContext = context;
    mProps = objects;
    mLayout = tv_btn_layout;
    mListener = listener;
}

public void updateValue (int position, String newValue) {
    mProps.get(position).setValue(newValue);
    notifyDataSetChanged();
}

private class ViewHolder {
    TextView mName;
    Button mValue;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        LayoutInflater mInflater = LayoutInflater.from(mContext);
        convertView = mInflater.inflate(mLayout, null);
        holder.mName = (TextView) convertView.findViewById(R.id.prop);
        holder.mValue = (Button) convertView.findViewById(R.id.value);
        convertView.setTag(holder);
    }
    else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.mName.setText(mProps.get(position).getName());
    holder.mValue.setText(mProps.get(position).getValue());

    holder.mValue.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mListener.onButtonClicked(position);
        }
    });

    return convertView;
}

public interface ButtonListener {
    void onButtonClicked (int position);
}
}

我想知道在调用活动被销毁后如何删除ButtonListeners侦听器。

PS: SettingsProperty是具有字符串名称和String值的POJO ,而tv_btn_layout是具有TextViewButton的布局,如上所述。

如果要删除自定义侦听器,则必须将其重置为null。 您可以创建一个二传手

public void setButtonListener (final ButtonListener listener) {
    mListener = listener;
}

并从外部调用null 只是要确保在访问mListener之前,检查null

如果您的意图不是在活动被破坏的情况下不调用侦听器方法,则重写您的Activity的onfinish()并初始化布尔标志。

private boolean IsActivityAlive;

   @Override
   protected void onDestroy() {
    IsActivityAlive=true;
     super.onDestroy();
    }

在您的接口方法内部,只需检查布尔标志是否为假,执行所需的操作,否则忽略

   void onButtonClicked (int position){
   if(!IsActivityAlive){

      //Do remaining task }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM