2011-10-29 65 views
1

我有一個活動(不ListActivity,雖然我應該我的代碼可能轉換成一個,因爲它只是顯示一個ListView)。在這個ListView中,我有一個行設置佈局,它包含兩個TextView和一個CheckBox。佈局由另一個活動共享,因此我設置了CheckBox.visibility="GONE",以便活動可以在需要複選框時自行啓用它們。如何設置可點擊的元素的聽衆在ListBox

我對我的ListView有一個SimpleCursorAdapter。在此適配器我重寫setViewValue()這樣我就可以選中該複選框,這樣的:

adapter = new SimpleCursorAdapter(this, R.layout.location_browser_listview_relative, cursor, FROM, TO); 
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
    @Override 
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
    if (view.getId() == R.id.checkBox) { 
     // Enable the star-checkbox 
     ldb.isFavourite(cursor.getInt(cursor.getColumnIndex(LocationDB.C_ID))); 
     view.setVisibility(View.VISIBLE); 
     ((TextView)view).setText(""); 
     return true; 
    } 

    return false; 
    } // setViewValue 
}); // setViewBinder 

而且我已經安裝了onClickListener()因爲用戶應該點擊列表元素(整行)。監聽器是這樣的:

listItems.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    final int numItems = cursor.getInt(cursor.getColumnIndex(LocationDB.C_NUM_ITEMS)); 
    String foo = String.format(TAG + "Clicked: %d", numItems); 
    Log.i(LOG_TAG, foo); 

    AlertDialog.Builder dialog = new AlertDialog.Builder(StoreBrowser.this); 
    dialog.setMessage("Vill du bevaka?"); 
    dialog.setPositiveButton("Ja", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
     // TODO: Save to DB here 
     System.out.println("Hello from onClick"); 

     ldb.addFavourite(ID); 
     } 
    }); // setPositiveButton   

    dialog.setNegativeButton("Nej", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
     Toast.makeText(getApplicationContext(), "Clicked no", Toast.LENGTH_SHORT).show(); 
     } 
    }); // setNegativeButton   

    dialog.show(); 
    } // onItemClick 
}); // setOnItemClickListener 

問題:

  1. 在setViewValue(),代碼ldb.isFavourite()根據logcat的(我的方法使用Log.d())發佈三次 。爲什麼叫三次?有一個SQL查詢在其中運行,並且我懷疑這對於每個listview行運行三次會相當昂貴。

2a。我怎樣才能攔截點擊複選框?當用戶切換複選框時,我需要切換布爾變量。 onClick()僅在用戶單擊整個列表視圖行時觸發,但當單擊該複選框時不會發生任何事情。

2b。有沒有辦法同時收集所有複選框信息,而不是在用戶點擊時切換布爾值?我的意思是,當用戶完成選擇時,是否有辦法在循環中逐個瀏覽所有的監聽並獲取點擊值?

獎金問題:我懷疑我應該重寫這段代碼,並手動給listview及其元素充氣,所以如果任何人都可以指向我描述這種工作的好資源,我會很感激。 Google的API文檔不是很有幫助。

回答

0

@ 1.有多少行沒有光標迭代? - 我懷疑這可能是3

@ 2B。不太清楚有關ListView,但看看ViewGroup.getChildAt()通過ListView的孩子進行迭代,並在View.findViewById()定位的ListView的每個孩子裏面你想要的子視圖。

+0

@ 1:目前只有一個DB行只有一個ListView的行,這就是爲什麼我beign困惑的是爲什麼該方法被稱爲三次。 – bos

相關問題