我有一個活動(不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
問題:
- 在setViewValue(),代碼
ldb.isFavourite()
根據logcat的(我的方法使用Log.d())發佈三次 。爲什麼叫三次?有一個SQL查詢在其中運行,並且我懷疑這對於每個listview行運行三次會相當昂貴。
2a。我怎樣才能攔截點擊複選框?當用戶切換複選框時,我需要切換布爾變量。 onClick()
僅在用戶單擊整個列表視圖行時觸發,但當單擊該複選框時不會發生任何事情。
2b。有沒有辦法同時收集所有複選框信息,而不是在用戶點擊時切換布爾值?我的意思是,當用戶完成選擇時,是否有辦法在循環中逐個瀏覽所有的監聽並獲取點擊值?
獎金問題:我懷疑我應該重寫這段代碼,並手動給listview及其元素充氣,所以如果任何人都可以指向我描述這種工作的好資源,我會很感激。 Google的API文檔不是很有幫助。
@ 1:目前只有一個DB行只有一個ListView的行,這就是爲什麼我beign困惑的是爲什麼該方法被稱爲三次。 – bos