0

このアレイ アダプタを理解するのに苦労しています。

いくつかのチュートリアルとこのページの助けを借りてこれをまとめましたアイテムリストビューのボタンをクリックしたときにアンドロイドのリストビューからアイテムを追加/削除する方法

しかし、getView の実行時に「adapter」が「null」に設定されるという問題があります。これがどのように起こっているのかわかりません。アダプターをbackupAdapterにバックアップし、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;
    }
    }
}
4

1 に答える 1

2

この行:

CustomAdapter adapter = new CustomAdapter(this, list);

ローカル変数を作成するため、フィールドアダプターは初期化されません。代わりに、新しく作成したアダプタを次のようにフィールドに割り当てます。

adapter = new CustomAdapter(this, list);
于 2014-05-01T11:03:10.720 に答える