【问题标题】:ListView multiple select with custom layout具有自定义布局的 ListView 多选
【发布时间】:2012-06-03 21:35:10
【问题描述】:

我正在尝试制作类似 gmail 的列表视图。 That is, initially, the listview is in single choice mode, but when a checkbok is selected, it becomes multiple choice.

这是我目前所拥有的:

     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重用相同复选框的方式?

【问题讨论】:

标签: android android-listview


【解决方案1】:

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

  • 将 ListView 保留为 SINGLE_CHOICE,但使用侦听器设置每一行的 CheckBox,该侦听器将行的 id 添加/删除到名为 checkedRows 的列表(例如)。

  • 当您想要删除、移动、加注星标等选中的行时:遍历checkedRows 并执行必要的操作。

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

加法

我从未覆盖 setViewValue(),但这应该可以:

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

在你的onClickListener():

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

【讨论】:

  • 但是如何在监听函数中获取行ID呢?那就是我出错的地方。
  • @arnab321 抱歉耽搁了,这条评论从我身边溜走了。如果你还没有解决这个问题,我添加了一个更新。
  • 我认为这行不通,因为我还提到了重复复选框被勾选的问题,因为 android 重用了视图。如果您只对一个复选框执行setTag 并向下滚动一点,您会遇到更多具有相同标签的复选框。
  • 我通过在newView() 中设置标签并完美地为每个 CheckBox 调用一个 OnCheckedChangeListener 中的标签,将此方法与扩展的 CursorAdapter 一起使用。抱歉,您认为它行不通。
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多