我有一些代码应该允许用户删除文件夹(它确实如此),然后它应该从"最近的文件夹"列表中删除 - 但它不是。该文件夹保留在"最近文件夹"列表中,即使用户将其删除 - 这是不希望的。
/**
* 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
,并且您的所有数据都会从最终来源重新加载,就像您第一次打开该屏幕一样(或者从活动的旧实例传递的数据,如果您以这种方式设置了它)。