如果选中任何项目,CheckBoxes的Android ListView将始终检查第一项

时间:2012-04-24 08:15:00

标签: android listview checkbox

最近,我遇到了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()); 
                    }
                }
            }
        }); 
    }
}

1 个答案:

答案 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);     
        }