Android:ListView适配器中的O​​nClickListener有时不工作

时间:2015-06-30 11:08:51

标签: android listview android-listview

我有一个包含多个包含进度条的项目的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而无需多次调用此方法?

更新:我减少了调用方法的次数,现在点击响应更快。但它有时仍会发生。

谢谢。

2 个答案:

答案 0 :(得分:1)

我认为导致onClickListener无法正常工作的主要原因是Main ThreadUI Thread}非常繁忙。因为您每秒都更新UI,并且您有更多项目,因此工作量非常大 - &gt;有些时候click on ItemMain 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;
    }
}