【问题标题】:Implementing custom checkable list view + dynamic adapter实现自定义可检查列表视图 + 动态适配器
【发布时间】:2012-12-22 23:51:34
【问题描述】:

我已经实现了包含两行(名称和编号)的自定义列表视图,它是可检查的。 列表视图有多个选择选项。

每当用户搜索名称时,光标都会返回新的项目列表。一旦适配器被新的光标项目更改,我就无法跟踪之前选择的项目。

例如,用户搜索名称“Jo”,它返回 10 个项目,其中我选择了 2 行。一旦我删除搜索,光标和适配器就会改变。我无法标记已检查的项目。

我想根据位置覆盖默认的可检查项目(必须编写自己的必须根据 _id(联系人 ID)使项目可检查) (我尝试覆盖 onFinishInflate 方法。但没有帮助)。

任何帮助表示赞赏。 提前致谢。

【问题讨论】:

  • “一旦适配器被新的光标项目更改,我就无法跟踪之前选择的项目。”当然可以...只需从列表视图的源中关闭某些内容。

标签: android listview


【解决方案1】:

你需要一个对象来让你的复选框数据保留你的适配器和列表视图。布尔数组的哈希图就足够了。

private HashMap<String, boolean[]> contactMap;

我想你可以在一些数据库方法或其他东西中加载它,如果需要的话,你可以将人名(如“Jo”)作为标识符。数组索引将对应于每个列表视图行中出现的复选框。然后在你的适配器中,我想是CursorAdapter,你可以有以下内容:

private boolean[] contactObj;

public void setContactObj(boolean[] contactObj) {
    this.contactObj = contactObj;
    notifyDataSetChanged();
}

public boolean[] getContactObj() {
    return contactObj;
}

@Override
public void bindView(View view, Context context, Cursor c) {
    final int position = c.getPosition();
    final CheckBox cb = (CheckBox) view.findViewById(R.id.checkbox);

    cb.setChecked(contactObj[position]);
    cb.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (cb.isChecked()) {
                contactObj[position] = true;
            } else {
                contactObj[position] = false ;
            }
        }
    });
}

基本上,您有一个只能容纳一个 boolean[] 的适配器,它能够调整列表视图中的复选框,在单击复选框时修改为 boolean[],然后在您仍然需要它。

【讨论】:

  • 谢谢芒果。我解决了上述问题。现在我面临另一个问题。请参阅以下链接stackoverflow.com/questions/14000837/…
  • 当适配器发生变化时,我在维护可检查项目时遇到了问题。 (以某种方式,我创建了自定义适配器,它应该根据我的自定义 id [_contact_id] 跟踪项目)。被检查的项目被维护,但它一直被它的位置维护。因此,只要没有任何列表项发生更改,适配器/可检查项仍会根据其位置跟踪选定的 id。所以它选择了错误的项目,请参阅上面的评论和链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2011-12-31
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多