无法在不更改方向的情况下刷新列表 - Android / Java



我有一些代码应该允许用户删除文件夹(它确实如此),然后它应该从"最近的文件夹"列表中删除 - 但它不是。该文件夹保留在"最近文件夹"列表中,即使用户将其删除 - 这是不希望的。

/**
* Add recent folders to the list in order as acquired by the {@link RecentFolderList}.
*
* @param destination List of drawer items to populate
*/
private void addRecentsToList(List<DrawerItem> destination) {
    // If there are recent folders, add them.
    final List<Folder> recentFolderList = getRecentFolders(mRecentFolders);
    // Remove any excluded folder types
    if (mExcludedFolderTypes != null) {
        final Iterator<Folder> iterator = recentFolderList.iterator();
        while (iterator.hasNext()) {
            if (isFolderTypeExcluded(iterator.next())) {
                iterator.remove();
            }
        }
    }
    if (recentFolderList.size() > 0) {
        destination.add(DrawerItem.ofHeader(mActivity, R.string.recent_folders_heading,
        mBidiFormatter));
        // Recent folders are not queried for position.
        for (Folder f : recentFolderList) {
            destination.add(DrawerItem.ofFolder(mActivity, f, DrawerItem.FOLDER_RECENT,
            mBidiFormatter));
        }
    }
}

奇怪的部分是,如果我执行方向更改 - 文件夹会根据需要从"最近的文件夹列表"中删除 - 我不确定为什么会发生这种情况。

我有一种感觉,列表可能只需要刷新(在删除文件夹后),但我不确定。

任何建议,线索或指示将不胜感激。

完整来源:

http://pastebin.com/fiX4S9fB

附言

在适配器上调用 notifyDataSetChanged()(如下面的答案之一所建议的那样 - 以及将其标记为重复项的人 - 似乎没有任何影响)

ListView上调用invalidate方法会导致adapter刷新或notifyDatasetChanged

如果您执行方向更改,您的活动将被破坏并重建。然后,您的成员变量mRecentFolders可能为空。为防止这种情况,请将 AndroidManifest.xml 中以下代码的最后一行添加到您的活动中:

<activity
android:name="name"
android:label="label"
android:configChanges="orientation|keyboardHidden|screenSize"> /*add this line*/

我查看了您的代码,似乎您正在使用的列表有很多不同的副本。我的猜测是,您正在从其中一个列表中删除该文件夹,而不是从其他列表中删除该文件夹。

ListAdapter在Android中的工作方式是:你使用对数据源(比如列表或数组)的引用来创建它们,然后当你更改该数据源时,你必须使用notifyDataSetChanged()通知他们,他们有责任刷新视图。如果在您的情况下没有发生这种情况,则意味着您用于创建列表适配器的数据源未更新...这只是您的内部应用程序逻辑问题,与Android无关。

另外,我注意到您的代码有多个适配器,其中一些适配器覆盖notifyDataSetChanged()并且不调用超级实现。确保你这样做不会破坏链条。

哦,当您

旋转屏幕时它被刷新的原因是,此时会重新创建整个Activity,并且您的所有数据都会从最终来源重新加载,就像您第一次打开该屏幕一样(或者从活动的旧实例传递的数据,如果您以这种方式设置了它)。

相关内容

  • 没有找到相关文章