最近遇到一个ListView的问题。其中有一个复选框列表。选中的项目被馈送到调用 Activity,该 Activity 使用 startActivityForResult 启动我的 ListActivity。如果在调用 ListActivity 之前有任何选中的项目,则将这些项目传递给它,以便用户可以编辑他以前的选择而不是重新开始。第一次一切都很好。但是当我想通过再次调用 ListActivity 来更改选择时,列表中的第一个复选框看起来就像检查列表中的任何项目是否被检查一样。事实上,它未被识别为已检查,即检查已选择项目的代码在处理第一项时不会触发,并且在再次保存选择后,只要第一项不是返回给父项的列表的一部分它没有被明确检查(通过取消检查然后再次检查)。
当我搜索这个问题时,我发现一个ListView的第一项接收焦点,所以我尝试了
listView.setItemsCanFocus(false);
没有效果。实际上,如果它有效,我会感到惊讶,因为该项目仅在有非空选择时才被检查。由于我没有发现任何问题可以解决我的问题,因此我将其归结为一个仍然产生所描述效果的示例。对不起所有的代码,但我完全不知道要寻找什么,所以我不知道如何通过发布更少来描述我的问题。
调用活动的 onCreate 和 onActivityResult:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listItems = new ArrayList<String>();
list = (TextView) findViewById(R.id.list);
list.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle extras = new Bundle();
extras.putStringArrayList("item_list", listItems);
Intent i = new Intent(Main.this, CheckBoxListActivity.class);
i.putExtras(extras);
startActivityForResult(i,1);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
Bundle extras = new Bundle();
extras = intent.getExtras();
String[] strings = extras.getStringArray("item_list");
String text = "";
listItems.clear();
for ( String item : strings ) {
text = text + item + ", ";
listItems.add(item);
}
if ( text.length() != 0 ) {
text = text.substring(0, text.length() - 2);
} else {
text = "(nothing here)";
}
list.setText(text);
}
ListActivity 中的 onCreate() 和 finish():
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.checkbox_list);
listView = getListView();
save = (Button) findViewById(R.id.save_button);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(LOG_TAG, "save button clicked");
finish();
}
});
ArrayList<String> itemList = new ArrayList<String>();
itemList.add( "foo" );
itemList.add( "bar" );
itemList.add( "baz" );
itemList.add( "qux" );
itemList.add( "quux" );
checkedItems = getIntent().getExtras().getStringArrayList("item_list");
ArrayAdapter<String> arrayAdapter = new ItemsAdapter(this, R.layout.checkbox_list, itemList);
listView.setAdapter(arrayAdapter);
}
@Override
public void finish() {
Bundle extras = new Bundle();
String[] stringArray = new String[checkedItems.size()];
for ( int i = 0; i < checkedItems.size(); i++) {
stringArray[i] = checkedItems.get(i);
}
extras.putStringArray("item_list", stringArray);
Intent mIntent = new Intent();
mIntent.putExtras(extras);
setResult(RESULT_OK, mIntent);
super.finish();
}
和 ArrayAdapter:
private class ItemsAdapter extends ArrayAdapter<String> {
public ItemsAdapter(Context context, int textViewResourceId, List<String> items) {
super(context, textViewResourceId, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.checkbox_list_row, null);
}
String entry = getItem(position);
v.setTag(entry);
fillText(v, R.id.checkbox, entry);
return v;
}
private void fillText(View v, int id, String text) {
Log.i(LOG_TAG, "this is fillText, our text is: " + text);
CheckBox checkBox = (CheckBox) v.findViewById(id);
if ( checkedItems.contains(text)) {
Log.i(LOG_TAG, "item has to be checked");
checkBox.setChecked(true);
}
checkBox.setText(text == null ? "" : text);
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton cb, boolean isChecked) {
String tag = (String) cb.getTag();
if (cb.isChecked()) {
// add item to set of checkedItems
if ( !checkedItems.contains(tag)) {
checkedItems.add(tag);
Log.i(LOG_TAG, "checkedItems: " + checkedItems.toString());
}
} else {
// remove item from set of checkedItems
if ( checkedItems.contains(tag)) {
checkedItems.remove((String) cb.getTag());
Log.i(LOG_TAG, "checkedItems: " + checkedItems.toString());
}
}
}
});
}
}