ListView多选用自定义布局

时间:2012-06-03 21:35:11

标签: android android-listview

我正在尝试制作类似Gmail的列表视图。也就是说,最初,listview处于单选模式,但是当选择了checkbok时,它将成为多选。

这是我到目前为止所做的:

     SimpleCursorAdapter dataSource = new SimpleCursorAdapter(this, R.layout.listitem, cursor,
             new String[]{"_id","a","b","c","d","e","f","g","h"}, 
             new int[] { R.id.checkBox1, R.id.a, R.id.b, R.id.c, R.id.d, R.id.e}
// all of these are a part of my list item custom layout.
             );

    dataSource.setViewBinder(new SimpleCursorAdapter.ViewBinder() {

@Override
public boolean setViewValue(View aView, final Cursor c, int i) {

    String s=c.getString(i);
    String toset="";
    TextView tv = i==0?null: (TextView) aView;
    if (i==0){
        if(chkL==null){
            chkL=new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton cb1, boolean isChecked) {
                    CheckBox cb=(CheckBox) cb1;
                    chkid[c.getPosition()]=isChecked;

                    if(lv.getChoiceMode()!=lv.CHOICE_MODE_MULTIPLE){
                        lv.setChoiceMode(lv.CHOICE_MODE_MULTIPLE);
                    }
                    lv.setItemChecked(c.getPosition()+1,isChecked);
                    log(isChecked+" selected "+(c.getPosition()+1));
                }

        };
        }

        CheckBox cb= (CheckBox) aView;
        cb.setOnCheckedChangeListener(chkL);

        return (i==0);
    }};

目前我正试图通过按下复选框来至少使项目“选中”。我正在使用c.getPosition()+1(光标的位置)来获取点击的列表项的位置。但这总是似乎返回1或有时随机值。

更新 看起来它总是返回1,但是当我遍历getCheckedItemPositions()时,我看到该项目没有。 10被选中。点击另一个复选框,光标位置将再次为1,但是第11项将被选中,依此类推。但如果我在复选框外点击,则会选择正确的项目。

此外,在选择一个复选框时,如果向下滚动,您会看到其他几个复选框都已选中。 (我在列表中有大约255个项目)。我认为这是由于android重用相同复选框的方式?

1 个答案:

答案 0 :(得分:0)

我会尝试稍微不同的方法:

  • 将ListView保持为SINGLE_CHOICE,但是将每行的CheckBox设置为一个侦听器,该侦听器将行id添加/删除到名为checkedRows的列表中(例如)。 / p>

  • 如果要删除,移动,加注等已检查的行:迭代checkedRows并执行必要的操作。

我认为这比在多种类型的默认状态和功能之间来回切换更简单。

<强>加成

我从未覆盖setViewValue(),但这应该有效:

CheckBox cb= (CheckBox) aView;
cb.setOnCheckedChangeListener(chkL);
cb.setTag(c.getLong(c.getColumnIndex("_id"))); // Add this

和您的onClickListener()

long id = (Long) cb1.getTag();