删除/删除项目后刷新具有多种视图类型的listView

时间:2013-03-13 10:31:32

标签: android listview adapter baseadapter

我有一个ListView,其中包含一个扩展BaseAdapter并具有两种视图类型的自定义适配器。当我运行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)但是当我只是想从一个项目中移除一个项目时,这似乎完全矫枉过正可能很长的清单。在删除之前和之后看到图片: Before

然后我删除第一项。隐藏在“让我看它”项目后面的“哪个”这个词现在被“灵感来自...”项目隐藏在一个空白项目3后面。

After

因此,数据正在更新,而视图类型则没有。谢谢你的帮助!

3 个答案:

答案 0 :(得分: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);
     }
}

答案 1 :(得分:0)

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

Youradapter.notifyDataSetChanged();

答案 2 :(得分:0)

使用yourlistview.invalidateViews()

而不是

notifyDataSetChanged();

它对我有用。