Android ListView/自定义数组适配器-调用getView时适配器设置为null

Android ListView/自定义数组适配器-调用getView时适配器设置为null,android,listview,null,android-arrayadapter,getview,Android,Listview,Null,Android Arrayadapter,Getview,我很难弄清楚这个阵列适配器的东西 在一些教程和本页的帮助下,我将这些内容放在了一起 但是我遇到了一个问题,当getView运行时,“适配器”被设置为“null”。我不知道这是怎么发生的。我已经找到了一个可怕的黑客解决方案,将适配器备份到备份适配器,然后在需要调用adapter.notifyDataSetChanged()时将其复制回来 我发现,第一次使用deleteButton时,resetAdapter发现适配器为null,并从backupAdapter复制该值。之后就没事了,不需要再恢复了。

我很难弄清楚这个阵列适配器的东西

在一些教程和本页的帮助下,我将这些内容放在了一起

但是我遇到了一个问题,当getView运行时,“适配器”被设置为“null”。我不知道这是怎么发生的。我已经找到了一个可怕的黑客解决方案,将适配器备份到备份适配器,然后在需要调用adapter.notifyDataSetChanged()时将其复制回来

我发现,第一次使用deleteButton时,resetAdapter发现适配器为null,并从backupAdapter复制该值。之后就没事了,不需要再恢复了。所以我的代码是有效的,但很可怕。我做错了什么

public class EditTaskList extends Activity {
    private static ArrayList<Something> list;
    private CustomAdapter adapter;
    private CustomAdapter backupAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_task_edit);
        ListView listView = (ListView)findViewById(R.id.edit_task_listview);
        list = MainActivity.getMasterList();

        CustomAdapter adapter = new CustomAdapter(this, list);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        backupAdapter = adapter;
    }

    public void resetAdapter(){
        if(adapter == null){
            System.out.println("Not fixed");
            adapter = backupAdapter;
        }
        else{System.out.println("Fixed!");}
        adapter.notifyDataSetChanged();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.edit_task_list, menu);
        return true;
    }

    public class CustomAdapter extends ArrayAdapter<Something>{
        //private Context context;
        private ArrayList<Something> things;
        private LayoutInflater inflater;

        class ViewHolder {
            public TextView text;
            public Button editButton;
            public Button deleteButton;
        }

        public CustomAdapter(Context context, ArrayList<Something> things) {
            super(context, R.layout.edit_task_list_item, things);
            inflater = LayoutInflater.from(context);
            this.things = things;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // reuse views
            ViewHolder viewHolder;
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = inflater.inflate(R.layout.edit_task_list_item, null);
                // configure view holder
                viewHolder.text = (TextView) ConvertView.findViewById(R.id.edit_task_name);
                viewHolder.editButton = (Button) convertView.findViewById(R.id.edit_task_edit);
                viewHolder.deleteButton = (Button) convertView.findViewById(R.id.edit_task_delete);
                convertView.setTag(viewHolder);
            }

            else {
                viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.text.setTag(position);
        viewHolder.text.setText(things.get(position).toString());
        viewHolder.deleteButton.setTag(position);
        viewHolder.editButton.setTag(position);
        viewHolder.deleteButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {
                int tag = (Integer)view.getTag();
                things.remove(tag);
                resetAdapter();
                }
        });

        return convertView;
    }
    }
}
公共类EditTaskList扩展活动{
私有静态数组列表;
专用自定义适配器;
专用自定义适配器备份适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list\u task\u edit);
ListView ListView=(ListView)findViewById(R.id.edit\u task\u ListView);
list=MainActivity.getMasterList();
CustomAdapter=新的CustomAdapter(此,列表);
setAdapter(适配器);
adapter.notifyDataSetChanged();
备份适配器=适配器;
}
public void resetAdapter(){
if(适配器==null){
系统输出打印项次(“不固定”);
适配器=备份适配器;
}
else{System.out.println(“修复!”);}
adapter.notifyDataSetChanged();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.edit_task_list,menu);
返回true;
}
公共类CustomAdapter扩展了ArrayAdapter{
//私人语境;
私人物品;
私人充气机;
类视图持有者{
公共文本查看文本;
公共按钮编辑按钮;
公共按钮删除按钮;
}
公共CustomAdapter(上下文、ArrayList内容){
super(上下文、R.layout.edit_任务、列表、项目、事物);
充气器=充气器。从(上下文);
这个东西=东西;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//重用视图
持票人持票人;
if(convertView==null){
viewHolder=新的viewHolder();
convertView=充气机.充气(R.layout.edit\u task\u list\u item,空);
//配置视图保持架
viewHolder.text=(TextView)ConvertView.findViewById(R.id.edit\u task\u name);
viewHolder.editButton=(按钮)convertView.findViewById(R.id.edit\u task\u edit);
viewHolder.deleteButton=(按钮)convertView.findViewById(R.id.edit\u task\u delete);
convertView.setTag(viewHolder);
}
否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.text.setTag(位置);
viewHolder.text.setText(things.get(position.toString());
viewHolder.deleteButton.setTag(位置);
viewHolder.editButton.setTag(位置);
viewHolder.deleteButton.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
int标记=(整数)view.getTag();
移除(标签);
重置适配器();
}
});
返回视图;
}
}
}
此行:

CustomAdapter adapter = new CustomAdapter(this, list);
创建一个本地变量,因此字段适配器永远不会初始化。相反,您希望将新创建的适配器分配给以下字段:

adapter = new CustomAdapter(this, list);

哎呀,真不敢相信我犯了这么大的错误!然后在专门寻找它的时候没有注意到它!不好意思,谢谢你!