0

雖然YMMV,但我認爲這是一個奇怪的困境。如何識別ListViews中的重用小部件

我使用的是一個佈局文件,它描述了ListView中的每一行/行(沒有什麼特別的)。我具有分配給每一個的ID,如:

機器人:ID = 「@ + ID/checkBox1」 機器人:ID = 「@ + ID/checkBox2」 機器人:ID =「@ + ID/checkBox3 「
機器人:ID =」 @ + ID/contactLabel」 //一個TextView

現在,這似乎並沒有什麼意義,因爲這些ID應該是唯一的,那麼什麼是第二 行的id?也就是說,如果「第1行」授予checkbox1,checkbox2,checkbox3和contactLabel的指定ID,那麼「第2行」ID將是什麼?

我很好奇,但也需要知道,因爲我想將複選框的值保存到SharedPreferences對象。

誰有關於如何解決這個問題的線索?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 更新

,我需要解決的第一件事是如何響應ListView的點擊。這是我與這一切當前難題:

的ListView不知道它被點擊,或不會告訴我

我已經添加了此事件處理程序,以我的ListActivity:

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     String item = (String) getListAdapter().getItem(position); 
     Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show(); 
    } 

...但它沒有被調用。我點擊顯示的聯繫人,但沒有去。

我也試着這樣說:

lv.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 
     Toast.makeText(getApplicationContext(), 
      "Click ListItem Number " + position, Toast.LENGTH_LONG) 
      .show(); 
    } 
}); 

...仍然沒有喜悅......我把兩個「吐司」線路斷點,他們永遠不會到達。

我讀到這裏:

http://www.vogella.de/articles/AndroidListView/article.html#listsactivity_layout

...是,「如果你在你活動需要更多的只是一個ListView,你可以用你自己的佈局 ListActivity。」

......我這樣做,因爲我除了列表視圖外還添加了頁眉和頁腳。

它繼續說:「在這種情況下,您的佈局必須有一個ListView元素,android:id 屬性設置爲@android:id/list。」

所以我將此添加到我的佈局:

...但它沒有什麼區別的一種方式或其他。

回答

1

的ID的爲ListView小部件中的物品都是通過他們的父視圖當您在getView()方法誇大它引用。

爲了詳細說明,你就會有這樣的事情是你ListView適配器。

public View getView(int position, View convertView, ViewGroup viewGroup) { 
     if (convertView == null) { 
      convertView = LayoutInflater.from(ctx).inflate(R.layout.list_view_item, null); 
      } 

Nown,一個新的視圖的實例存在作爲convertView。您可以使用covertView.findViewById(R.id.checkBox1)convertView.findViewById(R.id.checkBox2)等訪問您的小部件。

這些視圖中的每一個都是您的ListView的子碼。您可以使用從ListView對象getChildCount()getChildAt()方法從ListView引用每個單獨的視圖。 然而,因爲它是推薦使用convertView視圖回收的觀點,在這種情況下,您只能參照同時在屏幕上的意見。

此外,關於該SharedPreferences,在各方面的意見你ListViewAdapter子類,可以將實際的對象,把在CheckboxTextView小部件中的值填充。這Adapter有一個你提供它的數據集。爲什麼不直接引用數據集中的值,而不是試圖從數據集中填充的列表項中找到它們?當有人點擊一個CheckBox讓你有一個簡單的命令參照的ListView所有的項目你可以寫從ListView數據集。


UPDATE:追加的虛擬源代碼

確定。我們從一個優先列表開始。我們想在列表中顯示五個項目。爲了簡單起見,我假設每個人都有TextViewCheckbox。所以我的容器類是:

class Item { 
    String textView; 
    boolean checked; 
} 

現在在我的Activity,我想顯示這個名單,我把項目的ArrayList(你可以使用幾乎任何數據結構)作爲一類變量。然後我得到ListView引用併爲它分配一個適配器。

class MyActivity extends Activity { 
    ArrayList<Item> listItems; 
    ..... 
    onCreate(Bundle icicle) { 
     ..... 
     ListView listView = (ListView) findViewById(R.id.listView1); // this will be you list view 
     MyAdapter listAdapter = new MyAdapter(); 
     listView.setAdapter(listAdapter); 
     .... 
     // Rest of your Activity 
     .... 
     MyAdapter extends BaseAdapter { 

      int getItemCount() { 
       return listItems.size(); 
      } 

      Item getItem(int position) { 
       return listItems.get(position); 
      } 

      View getView(int position, View convertView, ViewGroup parent) { 
       // Here's the important part 
       Item currentItem = listItems.getItem(position); // Since the array is a class variable, you can do either get or getItem 

       ..... // do the standard individual item inflating .... 

       checkbox = convertView.findViewById(R.id.checkbox); 
       checkbox.OnItemSelectedListener(new OnItemSelectedListener() { // or whatever listener there should be... I didn't check 
        ... // do whatever... 
        currentItem.setChecked(true); 
      } 

當你想找回被點擊了哪些項目,只是通過項目級的迭代,並發現哪些是真實的,或者你執行你想要的任何行動Listener內,因爲你有一個參考標識ListView中的各個成員數據集(這裏是listItems ArrayList)。

道歉對任何錯誤。沒有做任何檢查。

+0

謝謝;你會碰巧有一些示例代碼顯示這可用? – 2012-02-14 15:10:24

+0

不想...但我很樂意瞭解一下您的實現,如果你有問題 – 2012-02-14 15:19:25

+0

我「不能確定(實際上,我幾乎沒有一個線索)你是什麼意思回覆:從數據集中引用丘壑一旦一切從聯繫人已加載,有沒有辦法推斷哪個聯繫人與我的複選框相關聯? – 2012-02-16 02:46:24