2011-02-14 36 views
3

我有一個自定義行佈局的ListActivity。行佈局由複選框,文本視圖和圖像按鈕組成。ListActivity與自定義佈局不調用getview

在這個背後是一個自定義對象的ArrayList,它包含一個String和一個布爾值。我想複選框來反映布爾值,反映斯汀的文本視圖,而右邊的按鈕將啓動一個動作。

我使用ArrayAdapter頁面上列出的最後一個構造函數來嘗試將這些全部綁定在一起。 ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)

出於某種原因,textView由對象toString()填充,而不是由getView填充。因此,該複選框永遠不會獲得布爾值。有任何想法嗎?

public class ListSelection extends ListActivity { 
    private ArrayList<ListItem> list; 
    private ArrayList<String> deleted; 

    static private final String TAG = "kinder"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(TAG, "ListSelection.onCreate"); 

     list = new ArrayList<ListItem>(); 
     deleted = new ArrayList<String>(); 

     Intent temp = getIntent(); 
     String[] listNames = temp.getStringArrayExtra("listNames"); 
     boolean[] listStatus = temp.getBooleanArrayExtra("listStatus"); 
     for (int i = 0; i < listNames.length; i++) { 
      list.add(new ListItem(listNames[i], listStatus[i])); 
     } 

     **setListAdapter(new ArrayAdapter<ListItem>(this, R.layout.selectionlistitem, R.id.text, list));** 

    } 

    private class ListItem { 
     String listName; 
     Boolean listStatus;  
     public ListItem(String name, boolean status) { 
      listName = name; 
      listStatus = status; 
     } 
     @Override 
     public String toString() { 
      return listName; 
     } 
    } 

    public class ListItemArrayAdapter extends ArrayAdapter<ListItem> { 
     int resource; 
     LayoutInflater vi; 
     private List<ListItem> items; 

     public ListItemArrayAdapter(Context context, int _resource, List<ListItem> listitems) { 
      super(context, _resource, listitems); 
      Log.d(TAG, "listItemArrayAdapter"); 
      vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      resource = _resource; 
      this.items = listitems; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      Log.d(TAG, "listItemArrayAdapter.getView"); 
      LinearLayout newView; 

      ListItem item = getItem(position); 

      if (convertView == null) { 
       newView = new LinearLayout(getContext()); 
       vi.inflate(resource, newView); 
      } else { 
       newView = (LinearLayout)convertView; 
      } 

      TextView textview = (TextView)newView.findViewById(R.id.text); 
      Log.d(TAG, item.listName); 
      textview.setText(item.listName); 

      CheckBox checkbox = (CheckBox)newView.findViewById(R.id.checkbox); 
      checkbox.setChecked(item.listStatus); 
      return newView; 
     } 
    } 

} 

回答

4

在我看來,你應該取代這一行:

setListAdapter(new ArrayAdapter<ListItem>(this, R.layout.selectionlistitem, R.id.text, list)); 

與此:

setListAdapter(new ListItemArrayAdapter<ListItem>(this, R.layout.selectionlistitem, list)); 

既然這樣,你正在使用的ArrayAdapter默認視圖生成邏輯,這是爲每個數組元素提供toString()TextView

+0

你是絕對正確的。你不會相信我在沒有看到那個錯誤的情況下花了多少時間。萬分感謝! – vanstrien 2011-02-14 12:37:03

相關問題