我有一个Activity(不是ListActivity,虽然我应该将我的代码转换为一个,因为它只显示一个ListView)。在这个ListView中,我有一个设置行的布局,它包含两个TextView和一个CheckBox。布局由另一个Activity共享,因此我设置了CheckBox.visibility="GONE"
,以便活动可以在需要复选框时自行启用它们。
我的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
问题:
ldb.isFavourite()
被发出三次。为什么叫三次?其中运行了一个SQL查询,我怀疑每个listview行运行三次会非常昂贵。 2a上。如何拦截复选框上的点击?当用户切换复选框时,我需要切换一个布尔变量。 onClick()
仅在用户单击整个列表视图行时触发,但单击该复选框时没有任何操作。
2B。有没有办法同时收集所有复选框信息,而不是在用户点击时切换布尔值?我的意思是,当用户完成选择时,是否有办法在循环中逐个浏览所有的元素并获取点击值?
奖金问题:我怀疑我应该重写这段代码并手动夸大listview及其元素,所以如果有人能指出我描述这类工作的好资源,我将不胜感激。 Google的API文档不是很有帮助。
答案 0 :(得分:0)
@ 1.您的游标迭代了多少行? - 我怀疑它可能是3。
@ 2b。不太确定ListView
,但请查看ViewGroup.getChildAt()
来遍历ListView
的孩子,并View.findViewById()
在每个孩子的内容中查找所需的子视图ListView。