Java 如何删除自定义侦听器?

Java 如何删除自定义侦听器?,java,android,android-arrayadapter,Java,Android,Android Arrayadapter,我的应用程序中有许多类似的ListActivity类:列表左侧有一个属性(TextView),右侧有一个值(按钮)。当我按下按钮时,我想创建一个对话框。由于可重复性,我决定创建一个通用的自定义ArrayAdapter,如下所示: public class GeneralTvBtnAdapter extends ArrayAdapter<SettingsProperty> { private Context mContext; private ArrayList<Setting

我的应用程序中有许多类似的
ListActivity
类:列表左侧有一个属性(
TextView
),右侧有一个值(
按钮
)。当我按下按钮时,我想创建一个对话框。由于可重复性,我决定创建一个通用的自定义
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);
}
}
public类GeneralTvBtnAdapter扩展了ArrayAdapter{
私有上下文;
私人ArrayList mProps;
私人内部布局;
私人按钮列表器;
公共通用VBTNAdapter(上下文上下文、int tv_btn_布局、ArrayList对象、ButtonListener侦听器){
超级(上下文、电视布局、对象);
mContext=上下文;
mProps=对象;
mLayout=tv\U btn\U布局;
mListener=监听器;
}
public void updateValue(int位置,字符串newValue){
mProps.get(位置).setValue(新值);
notifyDataSetChanged();
}
私有类视窗持有者{
文本视图mName;
按钮值;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
holder=新的ViewHolder();
LayoutInflater mInflater=LayoutInflater.from(mContext);
convertView=mInflater.充气(最小布局,空);
holder.mName=(TextView)convertView.findViewById(R.id.prop);
holder.mValue=(按钮)convertView.findViewById(R.id.value);
convertView.setTag(支架);
}
否则{
holder=(ViewHolder)convertView.getTag();
}
holder.mName.setText(mProps.get(position.getName());
holder.mValue.setText(mProps.get(position.getValue());
holder.mValue.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mListener.onButtonClicked(位置);
}
});
返回视图;
}
公共接口按钮列表器{
void onButtonClicked(内部位置);
}
}
我想知道如何在调用活动被销毁后删除ButtonListeners侦听器

注:SettingsProperty是一个带有字符串名称和
String
值的POJOtv\u btn\u布局是一个带有
TextView
按钮的布局,如上所述。

如果您想删除自定义侦听器,必须将其重置为空。您可以创建一个setter

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

并使用
null
从外部调用if。为了确保这一点,在访问
mListener
之前,请检查
null

如果您不打算在活动被破坏时调用侦听器方法,请覆盖活动的onfinish(),并初始化布尔标志

private boolean IsActivityAlive;

   @Override
   protected void onDestroy() {
    IsActivityAlive=true;
     super.onDestroy();
    }
在您的接口方法中,只需检查布尔标志,如果它为false,则执行所需操作,否则忽略

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

      //Do remaining task }

    }

好了,当活动被破坏时,Android会自动删除所有侦听器。我想写干净的代码,就这样。有人知道如何在程序执行的某个时刻监控内存中的变量吗?