最近,我遇到了ListView的问题。 其中有一个复选框列表。已检查的项目将被提供给使用startActivityForResult启动ListActivity的调用Activity。如果在调用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());
}
}
}
});
}
}
答案 0 :(得分:0)
您需要注意,可能会检查转换视图中的复选框。如果文本不在列表中,则需要取消选中它。
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);
} else {
checkBox.setChecked(false);
}