2011-06-26 48 views
1

我的問題是如何訪問和更改列表活動中的任何項目的複選框模式。我有一個帶有複選框和文本視圖的XML模板文件,這些文件定義了一行。這裏就是我試圖至今:顯然Android listActivity onListItemClick與複選框

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
     Toast.makeText(this, "You selected: " + Integer.toString(position), Toast.LENGTH_LONG).show(); 

     CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox); 
     if (checkbox.isChecked() == false) { 
      checkbox.setChecked(true); 
     } else { 
      checkbox.setChecked(false); 
     } 

} 

雖然使用R.id.checkbox只觸發第一個複選框(實際上,它確實名單的任何部分的第一個複選框,我看我的屏幕)。我不知道用什麼函數來獲取任何行的複選框。吐司工作順利,所以至少它正確登記位置。

感謝您的任何幫助。

編輯 - 我現在試圖繼承SimpleCursorAdapter以更好地控制我想要的行爲。下面是該子類:

public class musicPlaylist extends SimpleCursorAdapter { 

private Cursor c; 
private Context context; 
private ArrayList<String> checkList = new ArrayList<String>(); 
private final static int SELECTED = 1; 
private final static int NOT_SELECTED = 0; 

public musicPlaylist(Context context, int layout, Cursor c, 
     String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    this.c = c; 
    this.context = context; 

} 

public View getView(int pos, View inView, ViewGroup parent) { 
    View v = inView; 
    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.song_item, null); 
    } 

    this.c.moveToPosition(pos);  
    int columnIndex = this.c.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
    String song = this.c.getString(columnIndex); 

    TextView sTitle = (TextView) v.findViewById(R.id.text1); 
    sTitle.setText(song); 
    v.setId(NOT_SELECTED); 
    v.setTag(song); 
    v.setOnClickListener(new OnClickListener() { 



     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 


      if (v.getId() == NOT_SELECTED) { 
       v.setId(SELECTED); 
       Toast.makeText(context, "Test: " + v.getId(), Toast.LENGTH_SHORT).show(); 
       v.setBackgroundColor(Color.parseColor("#FFFFFF")); 

      } else { 
       v.setId(NOT_SELECTED); 
       Toast.makeText(context, "Test: " + v.getId(), Toast.LENGTH_SHORT).show(); 
       v.setBackgroundColor(Color.parseColor("#000000")); 
      } 

     } 
    }); 

    return v; 
} 

}

以供參考,在這裏是我做的ListActivity的XML:

<?xml version="1.0" encoding="utf-8"?> 

<ListView android:id="@android:id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:drawSelectorOnTop="false" 
      android:fastScrollEnabled="true" 
      android:cacheColorHint="#00000000" 
      /> 

<TextView android:id="@android:id/empty" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:text="No data"/> 

當前行爲:列表來自SD卡的歌曲被製作成一個不錯的可滾動列表。我確實從getView()的onClick得到了一些正確的迴應:第一次點擊一個項目時,它的Toast標籤是「1」,它的背景變白,而第二次我爲同一個項目吐司時,我得到「 0「,背景變黑,這是預期的。

問題是如果我選擇item1(使其背景爲白色),然後向下滾動,我會注意到item11,item21,item31,...等等也有白色背景。但是當我點擊它們時,它們的ID屬性會變爲「1」,這意味着它們在技術上從未被點擊過!所以基本上當滾動「刷新」到下一個10列表時,它將複製前10個的顏色方案...?

希望我解釋清楚。

回答

3

我認爲這是一個更深的問題,而不是直接的答案是必要的。

你想實現什麼?你真的只想選中你在屏幕上看到的複選框嗎?請注意,這可能是非常隨機的 - 列表視圖只保留在屏幕上可見的複選框的項目視圖,並且只要項目在屏幕外滾動,就會將其重用於其他項目。

我會說,幾乎肯定你需要改變列表中所有複選框的狀態(即使那些不可見)或它們的一些子集(如部分)。從而真正轉化爲正確的方法應該做到:標誌着相應的數據模型元素選擇相應的標誌 (你每件儲存一些布爾值)

  • 呼叫notifyDataSetChanged

    • 修改你的數據模型適當 ( )在你的適配器上。

    因此,列表視圖將重新創建屏幕上可見的所有視圖。假設適配器中的「getView()」被正確寫入,它將正確地讀取正確的模型並更新項目上的已檢查狀態。通過notifyDataSetChanged - 如果您在屏幕上可見10個項目,則會爲每個可見項目調用10次getView()。

  • +0

    我認爲你是對的。到目前爲止,我所做的是創建一個新類,該子類是SimpleCursorAdapter的子類,並且我正在覆蓋getView()方法。它會好起來的,但我通過改變文本背景顏色來測試onClick的視圖,並且我得到了「回收」效果或稱爲它,如果我在我的屏幕上選擇item1,它假定我也選擇了item11,item21等(並更改所有背景顏色)。我應該如何使每個視圖的onClick獨一無二? – JDS

    +0

    啊..這是另一個問題。看看這篇文章 - 它詳細解釋:http://developer.android.com/resources/articles/listview-backgrounds.html。在使用自定義背景的情況下,使用cacheColorHint(或禁用在Android listView中實現的優化)是所有問題。 –

    +0

    嗯,我不認爲這是我的問題,因爲我做了cacheColorHint,我仍然得到item1的onClick應用於item11,item21等(基本上每當屏幕刷新到新的選項集)的回收問題。你的答案的最後一句提到notifyDataSetChanged - 我應該在哪裏實現?怎麼樣? – JDS

    0

    您使用「全局」視圖來代替您的行視圖。試試這樣:

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
        super.onListItemClick(l, v, position, id); 
    
        CheckBox checkbox = (CheckBox) v.findViewById(R.id.checkbox); 
        if (checkbox.isChecked() == false) { 
         checkbox.setChecked(true); 
        } else { 
         checkbox.setChecked(false); 
        } 
    } 
    
    相關問題