2014-05-01 100 views
0

我在試圖弄清楚這個陣列適配器的東西時遇到了很多麻煩。ListView /自定義陣列適配器 - 當調用getView時被設置爲空的適配器

我已經與一些教程的幫助,而這個頁面How to add/remove item from listview in android when click button in item listview

把這個在一起,但我在這裏「適配器」被置爲「空」 getView運行時的問題。我不知道這是怎麼發生的。我已經解決了將適配器備份到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; 
    } 
    } 
} 

回答

2

這條線:

CustomAdapter adapter = new CustomAdapter(this, list); 

創建本地變量,因此該領域適配器永遠不會被初始化。相反,你想分配新創建的適配器到現場:

adapter = new CustomAdapter(this, list); 
+1

哎呀,我不能相信我做了這樣的noob錯誤! 然後沒有注意到它,而專門找它! *恥辱* 謝謝! – user3425269

相關問題