2010-09-05 28 views
1

我目前在我的Android應用程序中有一個ListView,其旁邊有一個CheckBox。Android - 在CheckBox上獲取相關的ListView行已更改

當複選框更改時,我想從listview行中獲取按鈕所在的一些信息,然後保留它,但是,我無法弄清楚如何從onClickChanged監聽器獲取行數據。

我的列表視圖是使用自定義JSONObject listadapter填充的,我希望這是類似的工作,檢測onLongTouch時選擇哪個行 - 例如下面是我用來獲取行的相關JSON對象的代碼在longTouch選擇:

public boolean onContextItemSelected(MenuItem item) { 
     //get row selected information 
     AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
     JSONObject selected = (JSONObject) getListAdapter().getItem(menuInfo.position); 

以上顯然是我的ListActivity中,我的onCheckChanged聽衆就不會在相同的活動(因爲它是該行中定義的,而不列表)

任何幫助將不勝感激!

回答

4

解決此問題的一種可能方法是在發生綁定時將某些信息附加到複選框。

在適配器中,添加(或修改)bindView覆蓋這樣添加一個標籤thatcontains您需要的上下文信息:

@Override 
    public void bindView(View view, Context context, Cursor cursor){ 
     CheckBox checker = (CheckBox)view.findViewById(R.id.checkbox); 

     checker.setOnCheckedChangeListener(MyActivity.this); 
     checker.setTag(Long.valueOf(cursor.getLong(cursor.getColumnIndex(BaseColumns._ID)))); 
     // call super class for default binding 
     super.bindView(view,context,cursor); 
    } 

(或任何其他值附加到幫助您識別複選框項,例如屬性格式名稱或索引)

然後,在onCheckedChanged,你可以參考此信息識別已更改的項目:

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    Long id = (Long) buttonView.getTag(); 
    if (id!=null) 
     Log.d(TAG, "onCheckedChanged id="+id); 

} 
+0

謝謝!實際上,我昨天晚上在複選框上使用了一個Tag,完全採用了相同的方法! (我經歷了這個問題和解決方案,很長一段時間,我的實際代碼是http://automateddeveloper.blogspot.com/2010/09/everything-you-need-to-know-about.html) – rhinds 2010-09-06 13:58:56