3

我有ListView一个自定义适配器,它扩展BaseAdapter并具有 2 种视图类型。当我运行我的adapter.removeRow(position)方法时,适配器的数据已正确更新,并且列表反映了这一点,但视图类型未正确更新。适配器由

ArrayList<Map<String, String>> rows = new ArrayList<Map<String, String>>();

我有一个子集

List<Integer> flashSet = new ArrayList<Integer>();

这是 ViewType 1 的所有位置的列表(与标准视图类型 0 相对)。

这是我的适配器removeRow(position)方法:

    public void removeRow(int position) {
        if (getItemViewType(position) == TYPE_FLASH) {
            flashSet.remove(position);
        }
        for (int flashPosition:flashSet) {
            System.out.println(tag+"is "+flashPosition+" going to be moved?");
             if (flashPosition > position) {
                 flashPosition -= 1;
                 System.out.println(tag+"Yes! It's been moved to "+flashPosition);
             }
        }
        rows.remove(position);
        notifyDataSetChanged();
    }

这是我的getView方法:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        FlashHolder flashHolder;
        ClipHolder clipHolder;
        int type = getItemViewType(position);
        if (convertView == null) {
            if (type == TYPE_CLIP) {
                convertView = rowInflater.inflate(R.layout.clip_note_row_layout, null);
                clipHolder = new ClipHolder();
                flashHolder = null;
                clipHolder.textView = (TextView)(convertView.findViewById(R.id.clip_text));
                convertView.setTag(clipHolder);
            } else {
                convertView = rowInflater.inflate(R.layout.flash_row_layout, null);
                clipHolder = null;
                flashHolder = new FlashHolder();
                flashHolder.front = (TextView)(convertView.findViewById(R.id.flash_text));
                flashHolder.back = (TextView)(convertView.findViewById(R.id.clip_text));
                convertView.setTag(flashHolder);
            }
        } else {
            if (type == TYPE_CLIP) {
                clipHolder = (ClipHolder)convertView.getTag();
                flashHolder = null;
            } else {
                clipHolder = null;
                flashHolder = (FlashHolder)convertView.getTag();
            }
        }
        if (type == TYPE_CLIP) {
            clipHolder.textView.setText(rows.get(position).get("clip"));
        } else {
            flashHolder.front.setText(rows.get(position).get("flash_text"));
            flashHolder.back.setText(rows.get(position).get("clip"));
        }
        return convertView;
    }

我知道我可以创建一个新的adapter,给它更新ArrayList并调用listView.setAdapter(adapter),但是当我只是试图从一个可能很长的列表中删除一个项目时,这似乎完全是矫枉过正。删除前后见图片: 前

然后我删除第一个项目。单词“which”隐藏在“Let's watch it”项后面,现在“inspired by…”项隐藏在空白项 3 后面。

后

所以,数据在更新,视图类型没有。谢谢您的帮助!

4

3 回答 3

1

我想到了。这对任何人都没有用,因为我不希望其他人犯同样的错误。

我天真地认为通过这样做

    for (int flashPosition:flashSet) {
        System.out.println(tag+"is "+flashPosition+" going to be moved?");
         if (flashPosition > position) {
             flashPosition -= 1;
             System.out.println(tag+"Yes! It's been moved to "+flashPosition);
         }
    }

我正在更改存储在List<Integer> flashSet = new ArrayList<Integer>();

实际上,我需要执行以下操作:

for (int flashPosition:flashSet) {
    System.out.println(tag+"is "+flashPosition+" going to be moved?");
     if (flashPosition > position) {
         flashSet.remove((Object)flashPosition);
         flashPosition -= 1;
         flashSet.add(flashPosition);
         System.out.println(tag+"Yes! It's been moved to "+flashPosition);
     }
}
于 2013-03-13T11:03:24.697 回答
0

试试这个,删除或添加项目后,您需要调用适配器刷新。

Youradapter.notifyDataSetChanged();
于 2013-03-13T10:34:26.160 回答
0

采用yourlistview.invalidateViews()

代替

notifyDataSetChanged();

这个对我有用。

于 2013-03-13T10:35:07.857 回答