通过android中的listView迭代,使每个项目前面的复选框可见

时间:2011-11-10 11:07:15

标签: android android-layout android-listview

我用android记事本教程代码开始。在我的notes_row.xml中,我有一个textview来显示note的标题,以及一个最初由android隐藏的复选框:visibility =“gone”

我希望当用户打开选项菜单并单击标记时,列表中每个项目前面的复选框将变为可见。但是,当我单击模拟器中的标记时,只有第一个音符的复选框变为可见。所以,我想迭代整个列表,并设置setVisibility(0),以便所有复选框都可见。我是初学者,所以请详细回答。提前谢谢。

我的代码段:

public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
    case INSERT_ID:
        createNote();
        return true;
    case MARK_ID:
                // only first item check box appears with following 2 lines:
                    CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
                    checkBox.setVisibility(0);

                /* tried the following, but no chekbox appears with this:   
        Cursor c = mDbHelper.fetchAllNotes();
        c.moveToPosition(0);
        while(c.isAfterLast()){
            CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
            checkBox.setVisibility(0);
            c.moveToNext();
        }
                 */
        return true;
}

阅读答案后我的新代码仍然只显示第一项的复选框:

public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
    case INSERT_ID:
        createNote();
        return true;
    case MARK_ID:
        CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
        String[] lvItems = new String[]{NotesDbAdapter.KEY_TITLE};
        MyAdapter arrAdapter = new MyAdapter(this, android.R.layout.simple_list_item_multiple_choice, lvItems);
        arrAdapter.toggleCheckBoxVisibility(checkBox);
        arrAdapter.notifyDataSetChanged();
                    return true;
    return super.onMenuItemSelected(featureId, item);
             }

这是我的适配器:

private class MyAdapter extends ArrayAdapter<String>{

    public MyAdapter(Context context, int textViewResourceId,
            String[] objects) {
        super(context, textViewResourceId, objects);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.notes_row, parent, false);
        //String[] from = new String[]{NotesDbAdapter.KEY_TITLE};
        return row;
        //return super.getView(position, convertView, parent);
    }

    public boolean toggleCheckBoxVisibility(CheckBox checkBox){
        checkBox.setVisibility(0);
        super.notifyDataSetChanged();
        return true;
    }

}

3 个答案:

答案 0 :(得分:0)

  1. 带上您的列表适配器
  2. 使用getView(或类似)
  3. 遍历列表项的视图
  4. 对于您获取的每个视图,请执行v.setVisibility(View.VISIBLE)
  5. 这大致是您与列表的每个视图进行交互所必须做的事情

    编辑:更具体地说: 在你的活动主线程中

    MyAdapter a= (MyAdapter) this.getArrayAdapter(); 
    //count how many views you have to iterate and build a for loop accordingly
    for(...){
        View v = a.getView(/*based on the for index position */).setVisibility(View.VISIBLE) 
    //Do something else with the view if you want...
    

    此解决方案假设您已经创建了数组适配器并将其与您的活动相关联。

答案 1 :(得分:0)

在适配器中创建一个方法,为可见性设置布尔标志。在按钮上单击调用该方法并将标志设置为true。然后使用notifyDataSetChanged()更新您的列表。 在getView方法中,您可以将复选框的可见性设置为布尔标志中的值。

答案 2 :(得分:0)

试试这个: 在你的课上写下这段代码:

@Override
protected void onStart() {
    super.onStart();

    ArrayAdapter<String> araAdapter=new ArrayAdapter<String>(getApplicationContext(),             

    android.R.layout.simple_list_item_multiple_choice, xmlList);
    listView_xml.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    listView_xml.setAdapter(araAdapter);
}

xmlList是您保存的数据或您的字符串[]数组。 listview_xml是你的listview的名字。 Go through this tutorial implementing multiple check boxes