我有一个包含多个包含进度栏的项目的ListView。我目前有一个线程设置来更新每个小节的进度,如下所示:
h = new Handler();
h.postDelayed(new Runnable() {
public void run() {
game.update();
h.postDelayed(this, 20);
}
}, 20);
然后,我更新每个列表项的进度,如下所示:
progress += timeInc;
if (progress >= progressMax)
completeWork();
updateView();
updateView方法执行以下操作:
public void updateView() {
try {
activity.runOnUiThread(updateView);
} catch (Exception e) {
e.printStackTrace();
if (listView != null)
listView.post(updateView);
}
}
因此,基本上,我每秒都要多次调用notifyDataSetChanged。当我不这样做时,ProgressBar的进度不会移动,但是我可以正常地单击Items。但是,尽管调用了很多次,有时列表中的Items上的OnCLickListener不会被触发。我认为它可能会被notifyDataSetChanged的调用以某种方式中断。
这是我在适配器中应用OnClickListener的位置:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
if (files != null) {
if (!files.get(position).isClicked()) {
// FAILED TO INTERACT:
}
}
}
});
listView.setAdapter(fileAdapter);
updateView = new Runnable() {
@Override
public void run() {
fileAdapter.notifyDataSetChanged();
listView.invalidate();
}
};
这是什么问题?还有什么其他方法可以更新progressBars而不必多次调用此方法?
更新:我减少了调用该方法的次数,并且单击现在响应更快。但是有时还是会发生。
谢谢你。
找出解决方案。与其更新整个列表,不如如下更新单个项:
public boolean updateProgress(File file) {
if (listView == null)
return false;
int position = files.indexOf(file);
int first = listView.getFirstVisiblePosition();
int last = listView.getLastVisiblePosition();
if (position < first || position > last) {
return false;
} else {
View convertView = listView.getChildAt(position - first);
ProgressBar bar = (ProgressBar) convertView.findViewById(R.id.progress_bar);
if (file.isWorking()) {
bar.setVisibility(View.VISIBLE);
bar.setMax(file.progressMax);
bar.setProgress(file.progress);
bar.invalidate();
} else {
bar.setVisibility(View.GONE);
}
return true;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句