setProgressbar没有在getView里面更新一个在activity上运行的线程?

时间:2014-12-23 12:30:37

标签: java android multithreading listview android-listview

我有一个listview,每个项目都有一个ProgressBar。我自己创建的线程在后台运行和下载数据,并且必须在每个项目的getView部分显示下载进度,但是我无法在适配器的getView方法中更新setProgressbar。

但是当用户上下滚动(远离特定视图)时,它会根据下载百分比更新进度并冻结而不会增加。

我的主题代码

downloading = Ion.with(LoadTumblrActivity.this)
  .load(item.getGifUrl())
  // can also use a custom callback
  // can also use a custom callback

.progress(new ProgressCallback() {

    @
    Override
    public void onProgress(long downloaded, long total) {

      float progressVal = ((float) downloaded / (float) total);

      item.setProgress((int)(100 * progressVal));

    }
  })
  .write(
    new File(Environment.getExternalStorageDirectory().getPath() + "/sdcard" + fileName))
  .setCallback(new FutureCallback < File > () {

    @
    SuppressLint("SdCardPath")@ Override
    public void onCompleted(Exception e, File file) {
      {

        if (e != null) {
          Toast.makeText(LoadTumblrActivity.this, "Error downloading file", Toast.LENGTH_LONG).show();
          System.out.println(e);
          return;
        }
      }
    }
  });

我的BaseAdapter

public View getView(int position, View convertView, ViewGroup parent) {

        View rowView = convertView;
        // reuse views
        if (rowView == null) {
            LayoutInflater inflater = activity.getLayoutInflater();
            rowView = inflater.inflate(R.layout.feed_item, parent, false);
            // configure view holder
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.progressBar = (ProgressBar) rowView.findViewById(R.id.progress);

            rowView.setTag(viewHolder);
        }

          holder.progressBar.setProgress(item.getProgress());

  }

2 个答案:

答案 0 :(得分:1)

你的问题是你打电话

holder.progressBar.setProgress(item.getProgress());
getViewgetView内的

仅针对屏幕上显示的项目进行调用。这就是为什么你的ProgressBar仅在滚动滚动来到屏幕的项目时更新!当您在getView中致电AsyncTask时,您需要在publishProgress();之外的onProgressUpdate内拨打此行,以便让用户真实体验到项目出现/完成下载。

另一种方法是将progressBar设置为intermediate= "false"并仅显示旋转进度条! ;)

希望有所帮助

答案 1 :(得分:0)

使用runOnuiThread更新进度条:

runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                progressDialog.setMessage(ii+" Apps Loaded...");
                ii++;
            }
        });

来自Helper+

的源代码