异步更改ListView中的特定项

时间:2014-01-16 13:11:16

标签: android listview android-listview baseadapter

所以我在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);
    }

我应该如何处理这个问题?

3 个答案:

答案 0 :(得分:2)

涉及编辑特定Views的任何其他答案都不是解决方案 - 它们会在您滚动的那一刻失败并且ListView行被回收!滚动时,ListView将继续使用列表/数组/ Jobs中的任何内容来重新填充自己。更不用说,你的ListView将拥有与Jobs一样多的行,它只有填充屏幕所需的行数。因此,您甚至无法访问与当前不可见的作业相关的行。取决于打开的设备,方向,如果您将来更改此屏幕的布局,可见行/作业的数量会有所不同,这使得“解决方案”更加糟糕。

假设您的自定义AdapterArray 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);

}