所以我在ListView
中有一个作业名称列表,该列表由扩展BaseAdapter
的自定义适配器生成。所有项目最初显示为灰色。对于每个项目,我通过Web服务发送异步请求以获取此作业的状态。同时,我在每一行显示一个不确定的进度条。每次收到响应时,都会为该特定项调用onSuccess(int itemPosition)的回调方法。 itemPosition是List中项目的索引。在这个方法中,我想根据收到的状态设置文本的颜色并删除进度条。我尝试了以下但没有运气:
public void onSuccess(int itemPosition, int status) {
View convertView = getLayoutInflater().inflate(R.layout.rowlayout, null);
((ProgressBar)convertView.findViewById(R.id.progressbar)).setVisibility(ProgressBar.GONE);
if(status == READY)
((TextView)convertView.findViewById(R.id.jobname))
.setTextColor(status == READY ? Color.GREEN : Color.RED);
mListViewAdapter.getView(itemPosition, convertView, null);
}
我应该如何处理这个问题?
答案 0 :(得分:2)
涉及编辑特定Views
的任何其他答案都不是解决方案 - 它们会在您滚动的那一刻失败并且ListView
行被回收!滚动时,ListView
将继续使用列表/数组/ Jobs
中的任何内容来重新填充自己。更不用说,你的ListView将不拥有与Jobs一样多的行,它只有填充屏幕所需的行数。因此,您甚至无法访问与当前不可见的作业相关的行。取决于打开的设备,方向,如果您将来更改此屏幕的布局,可见行/作业的数量会有所不同,这使得“解决方案”更加糟糕。
假设您的自定义Adapter
由Array
Jobs
(或您已决定支持的任何数据结构)支持,该数据结构是适配器的成员,只需更改Array
然后在适配器上调用notifyDataSetChanged
。这正是notifyDataSetChanged
的用途,您不会注意到整个ListView
更新。如果您希望优化ListView效果,请至少确保不会在每次getView
调用中夸大行视图,然后另外实现ViewHolder pattern。
答案 1 :(得分:1)
njzk2是对的。您可以在适配器中设置HashMap,该HashMap存储指定Job对象的“running”或“downloaded”状态。 适配器中的方法允许您设置此信息。在你的getView中,检查如果它正在“运行”或“已下载”而被夸大的Job对象并显示你想要的内容。即使你有一个convertView,也必须完成这项检查。
答案 2 :(得分:0)
尝试在您的活动中执行此操作:
public void onSuccess(int itemPosition, int status) {
View childView = yourListView.getChildAt(itemPostion);
((ProgressBar)childView.findViewById(R.id.progressbar)).setVisibility(ProgressBar.GONE);
if(status == READY)
((TextView)childView.findViewById(R.id.jobname))
.setTextColor(status == READY ? Color.GREEN : Color.RED);
}