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
值的POJO,tv\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会自动删除所有侦听器。我想写干净的代码,就这样。有人知道如何在程序执行的某个时刻监控内存中的变量吗?