- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我找不到与我的确切问题具体相关的内容,请继续阅读以找出具体内容。
我非常小心地确保在我的代码中的任何地方,我都设置为只调用适配器上的 notifyDataSetChanged,我初始化 itemList 一次,然后将其传递给适配器,并且不重新初始化它曾经。
它就像一个魅力, ListView 会自行更新,但仅限于新项目。
对于现有项目,ListView 将不会正确更新。
例如,如果我有一个显示一些自定义项的 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 = newItem.text2;
}
}
if (isDuplicate == false)
{
// add the new item
nonDuplicateItems.add(newItem);
}
}
// I have tried just adding these new ones to itemList,
// but that doesnt seem to make the listview update the
// views for the old ones, so I thought thuis might help
// by clearing, merging, and then adding back
nonDuplicateItems.addAll(itemList);
itemList.clear();
itemList.addAll(nonDuplicateItems);
// finally notify the adapter/listview
adapter.notifyDataSetChanged();
}
}
现在 ListView 将始终更新以显示新项目,但不会更新现有项目的 View 。
这是真正的关键,告诉我这是 View 的问题:如果我调用 adapter.getItem(position);
一个更新的预先存在的项目,返回的项目将显示更新的更改(意味着 text1 和 text2 将保留它们的新值)即使它没有反射(reflect)在 ListView 中!
如果我调用 listView.invalidateViews();
那么 ListView 将显示更新,但是我有两个问题,有时它会闪烁,有时,只是有时如果我调用它并且它在 notifyDataSetChanged
完成到达 ListView 之前运行,我收到“ ListView 未通知数据更改”错误!
有人知道吗?
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
if (convertView == null)
{
convertView = layoutInflator.inflate(R.layout.item_comment, null);
// when the holder is created it will find the child views
// it will then call refreshHolder() on itself
viewHolder = new ViewHolder(convertView, position);
convertView.setTag(viewHolder);
} else
{
viewHolder = ((ViewHolder) convertView.getTag());
viewHolder.refreshHolder(position);
}
return convertView;
}
public void refreshHolder(int position)
{
this.position = position;
tvText1.setText(getItem(position).text1);
tvText2.setText(getItem(position).text2);
}
我想知道我是否应该做的是在添加到列表之前使用复制构造函数重新实例化我的所有项目。也许在通知适配器时,如果 item
仍然是相同的引用,适配器会假定没有变化,因此不会重绘该 View ?或者适配器可能只在收到通知时才为新项目绘制新 View ?
要添加另一个细节,如果我向下滚动使更新的 View 离开屏幕,然后返回它,它会在 ListView 刷新/重新制作该 View 时显示正确的信息。
我想我需要 ListView 来刷新其所有当前 View ,所以 invalidateViews();
可能是我必须做的。
有人知道吗?
编辑:根据此处的要求,适配器会出现此问题。
public class ItemAdapter extends BaseAdapter
{
private final static int VIEWTYPE_PIC = 1;
private final static int VIEWTYPE_NOPIC = 0;
public List<Item> items;
LayoutInflater layoutInflator;
ActivityMain activity;
public ItemAdapter(List<Item> items, LayoutInflater layoutInflator, ActivityMain activity)
{
super();
this.items = new ArrayList<Item>();
updateItemList(items);
this.layoutInflator = layoutInflator;
this.activity = activity;
}
public void updateItemList(List<Item> updatedItems)
{
if (updatedItems != null && updatedItems.size() > 0)
{
// FIND ALL THE DUPLICATES AND UPDATE IF NESSICARY
List<Item> nonDuplicateItems = new ArrayList<Item>();
for (Item newItem : updatedItems)
{
boolean isDuplicate = false;
for (Item oldItem : items)
{
if (oldItem.getId().equals(newItem.getId()))
{
// IF IT IS A DUPLICATE, UPDATE THE EXISTING ONE
oldItem.update(newItem);
isDuplicate = true;
break;
}
}
// IF IT IS NOT A DUPLICATE, ADD IT TO THE NON-DUPLICATE LIST
if (isDuplicate == false)
{
nonDuplicateItems.add(newItem);
}
}
// MERGE
nonDuplicateItems.addAll(items);
// SORT
Collections.sort(nonDuplicateItems, new Item.ItemOrderComparator());
// CLEAR
this.items.clear();
// ADD BACK IN
this.items.addAll(nonDuplicateItems);
// REFRESH
notifyDataSetChanged();
}
}
public void removeItem(Item item)
{
items.remove(item);
notifyDataSetChanged();
}
@Override
public int getCount()
{
if (items == null)
return 0;
else
return items.size();
}
@Override
public Item getItem(int position)
{
if (items == null || position > getCount())
return null;
else
return items.get(position);
}
@Override
public long getItemId(int position)
{
return getItem(position).hashCode();
}
@Override
public int getItemViewType(int position)
{
Item item = getItem(position);
if (item.getPhotoURL() != null && URLUtil.isValidUrl(item.getPhotoURL()) == true)
{
return VIEWTYPE_PIC;
}
return VIEWTYPE_NOPIC;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ItemHolder itemHolder;
if (convertView == null)
{
if (getItemViewType(position) == VIEWTYPE_PIC)
{
convertView = layoutInflator.inflate(R.layout.item_pic, null);
} else
{
convertView = layoutInflator.inflate(R.layout.item, null);
}
// THIS CONSTRUCTOR ALSO CALLS REFRESH ON THE HOLDER FOR US
itemHolder = new ItemHolder(convertView, position);
convertView.setTag(itemHolder);
} else
{
itemHolder = ((ItemHolder) convertView.getTag());
itemHolder.refreshHolder(position);
}
return convertView;
}
@Override
public int getViewTypeCount()
{
return 2;
}
@Override
public boolean hasStableIds()
{
return false;
}
@Override
public boolean isEmpty()
{
return (getCount() < 1);
}
@Override
public boolean areAllItemsEnabled()
{
return true;
}
@Override
public boolean isEnabled(int position)
{
return true;
}
}
好的,我已经试过了
@Override
public boolean hasStableIds()
{
return true;
}
@Override
public long getItemId(int position)
{
return getItem(position).hashCode();
}
还有这个
@Override
public boolean hasStableIds()
{
return false;
}
@Override
public long getItemId(int position)
{
return getItem(position).hashCode();
}
我的哈希码是像这样使用的来自 apache 的反射生成器(应该会导致哈希根据值发生变化)
@Override
public int hashCode()
{
return HashCodeBuilder.reflectionHashCode(this);
}
但它没有用。据我所知,stableIds 什么也没做。
编辑:
在稳定 ID 的任意组合中,这些都不起作用。再一次,与往常一样,您必须将 View 滚动到屏幕外,然后再打开才能更新。
listview.refreshDrawableState();
listview.requestLayout();
listview.invalidateViews();
最佳答案
这里有一个类似的问题,有一个可能有效的解决方案:
关于java - 适配器上的 notifydataSetChanged 将更新新项目,但不会更新现有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23666101/
我有一个 Outlook 加载项,它是一个新的功能区选项卡,它连接到我的服务器数据库,用于将一些自定义数据与 Outlook 对象相关联。 此功能区选项卡目前显示在邮件项目中。 我正在扩展它以在任务和
我已经使用 MVC 从头开始创建了多个站点,但现在我的任务是迁移项目。 目前该站点有一个大型静态文件库 (*.html)。最终每个页面都将迁移到带有 View 和 Controller 的 MVC
我已经使用 Netbeans 几个月了并且非常喜欢它。我正在尝试启用一种方法来创建一个项目,该项目访问我服务器上的实时文件以进行更改。当我使用远程源创建项目时,它开始将所有服务器文件下载到我的计算机。
我想创建一个java项目(非Web)来利用Spring的特性,如依赖注入(inject)、事务数据、 Autowiring 等, 我想使用的一些功能: @服务 @Autowired @存储库 @事务性
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试在 Windows 10 上使用 Angular-cli 创建一个 Angular 4 项目。 我按照https://www.npmjs.com/package/@angular/cli中提
我正在开发小型 Android 应用程序,我想在 ListView 上显示新添加的项目。我正在从存储在 ArrayList>() 中的数据库中获取项目。因为我使用了 SimpleAdapter 。我将
我在商店中有一个带有 CoreData 模型的应用程序,我想完全更改该应用程序(删除一些垃圾、组织、新的 CoreData 模型...等)。 所以我想重新开始并创建新项目,当我尝试将商店中的旧应用程序
全新安装 Phoenix,我尝试触发一个新项目,当我尝试运行服务器时,我遇到了: Unchecked dependencies for environment dev: * gettext (Hex
在安装了必要的包“node.js”后,我试图创建一个新的 react 项目,我按照教程中的指导运行了用于创建应用程序的代码,但应用程序没有创建。这是收到的错误消息。 $ npm install -g
我想听听你的建议。可以添加新项目以右键单击 OSX 吗?例如,我在 safari、TextEdit、Notes、Pages、Preview 中选择任何单词,我想将这个单词发送到服务器并获得响应。有可能
我正在尝试创建一个新项目,并且我想使用 NHibernate(特别是 Fluent NHibernate)。 我学习一项新技术的最大问题就是设置它,我在这方面遇到了很多困难。我开始看这个 (http:
我正在开始我的第一家独立营利企业。我很难决定使用哪种语言。我想用 Perl 编写我的应用程序,但我认为编译起来不够简单。如果我不用 Perl 编写,我会用 C++ 编写。 该应用程序将具有许多功能,包
我在工作中开始一个新的客户端/服务器项目,我想开始使用一些我一直在阅读的新技术,LINQ 和泛型是主要技术。到目前为止,我一直在使用 MySQL 开发这些类型的应用程序,因为客户不愿意为 MSSQL
我要为我的另一半开始一个项目;根据特定标准搜索考古图像的能力。 搜索这些条件的能力就在我的街道上,一个与某些元数据相关联的图像(或其文件路径)数据库。该界面将允许搜索元数据,然后显示带有缩略图 Vie
我觉得我要为此疯狂了。 我正在尝试使用 Foundation 5 开始一个新项目,但我遇到了一个与我的 git 存储库相关的非常奇怪的问题。我之前一直在使用 Foundation 4,我已经检查过我是
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 5 年前。 Improve
当我在 Intellij 中创建一个新项目时,我收到了这些错误消息,我真的不知道如何缓解或解决这个问题。 我目前使用的是 Intellij IDEA 15 有人知道这个错误吗? Unknown Err
我会假设这只是意味着我缺少依赖项,但我无法创建任何类型的项目(控制台应用程序、Web 应用程序、Windows 窗体等)。我正在运行 VS 2012 premium。 最佳答案 您可能正试图将您的项目
摘要 有人知道当建议中不存在输入的内容时如何让 UI Fabric React TagPicker 添加新项目吗? 我还想向服务发送 AJAX 请求,以便在后端添加新项目。 所需功能 当有人在选择器中
我是一名优秀的程序员,十分优秀!