我有一个包含多个包含进度条的项目的ListView。我目前有一个Thread设置来更新每个Bars的Progress,如下所示:
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而无需多次调用此方法?
更新:我减少了调用方法的次数,现在点击响应更快。但它有时仍会发生。
谢谢。
答案 0 :(得分:1)
我认为导致onClickListener
无法正常工作的主要原因是Main Thread
(UI Thread
}非常繁忙。因为您每秒都更新UI,并且您有更多项目,因此工作量非常大 - &gt;有些时候click on Item
,Main Thread
忙,无法回复。
答案 1 :(得分:0)
找出解决方案。我只是更新单个项目,而不是更新整个列表:
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;
}
}