相关疑难解决方法(0)

适配器上的notifydataSetChanged将使用新项目进行更新,但不会更新现有项目

我找不到与我的确切问题有关的具体内容,请继续阅读以了解这是什么.

我非常谨慎地确保在我的代码中的所有地方,我设置正确的只是在适配器上调用notifyDataSetChanged,我初始化itemList一次,并将其传递给适配器,并且不要重新初始化它.

它就像一个魅力,列表视图将自行更新,但仅适用于新项目.

对于现有项目,ListView将无法正确更新.

例如,如果我有一个列表视图显示一些自定义项目,我需要更新它,我这样做

public void updateList(List<item> newItems)
{
    if (adapter == null)
    {
        itemList.addAll(newItems);
        adapter = new SomeAdapter(layoutInflator, itemList);
        listView.setAdapter(adapter);
    } else
    {
        // lets find all the duplicates and do all the updating
        List<item> nonDuplicateItems = new ArrayList<item>();
        for (Item newItem : newItems)
        {
            boolean isDuplicate = false;
            for (Item oldItem : itemList)
            {
                // are these the same item?
                if (newItem.id == oldItem.id)
                {
                    isDuplicate = true;
                    // update the item
                    olditem.text1 = newItem.text1;
                    oldItem.text2 = …
Run Code Online (Sandbox Code Playgroud)

java android

7
推荐指数
1
解决办法
1万
查看次数

为什么"notifyDatasetChanged()"没有通知所有可见的项目?

背景

注意:我一直在使用listViews,所以我非常熟悉如何使用适配器,ViewHolders等...所以这个问题对我来说没有意义.

这次我陷入了一种非常奇怪的行为,由于某种原因只出现在2台设备上:

  1. LG G2,Android 4.2.2

  2. Xperia J,搭载Android 4.1.2

问题

listView有自己的BaseAdapter,在某些事件中我更新其中的项集合(在UI线程上),并调用notifyDatasetChanged().

问题是在有问题的设备上,调用此函数仅在listView的某些可见行上调用getView.例如,如果行1,2,3,4,5可见,并且我调用notifyDatasetChanged,并且我将日志放在getView上,我可以看到它超过1,2,4,5(跳过第3行).

一些线索

  • 它总是跳过用户在其中单击的行(每行都有可点击的视图),触发notifyDatasetChanged调用.

  • 其他设备处理listview很好:2个Nexus 4设备(每个都有不同的版本),Galaxy S2和Galaxy S4.

  • 如果我调用notifyDataSetChanged一次或两次并不重要.

  • 即使我使用自己的BaseAdapter,我也没有改变ListView的工作方式.我没有扩展ListView.

  • 对于BaseAdapter类,我已经覆盖了下一个函数:

    • getViewTypeCount -returns 2
    • getItemViewType - 返回0或1,具体取决于行的类型
    • getCount将
    • 的getItem
    • getItemId - 我不需要它,所以我总是返回0(它不会让它返回位置).
    • getView
    • areAllItemsEnabled和isEnabled - 总是返回false,因为所有行都有内置视图,只有他们需要处理点击.

    我没有覆盖任何其他方法.当然我创建了辅助函数,但就是这样.

这个问题

它为什么会发生?

为什么它只发生在一些设备上?

我怎么解决这个问题?

有可能这是一些roms的错误吗?

如果是这样,有没有一个很好的解决方法,或者我真的应该在有问题的行上调用getView(它工作正常BTW,但我这样做很奇怪)?

android android-listview notifydatasetchanged

6
推荐指数
0
解决办法
1229
查看次数