在ListView中克隆的旋转轮进度条

时间:2014-08-22 09:27:56

标签: android listview android-listview android-asynctask android-progressbar

我有一个ListView填充文件作为项目。当我单击某个项目时,会启动AsyncTask,下载该文件。 现在,在下载文件时,我在ListView中的名称旁边有一个ProgressBar旋转。

我的问题是:当我点击某些项目时,即使我没有点击它们,也可以在列表视图中的其他项目上看到旋转轮。

CategoryActivity.java(ListView的活动,只是有用的部分):

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// Récupère les valeurs depuis ListItem
udl = ((TextView) view.findViewById(R.id.udl)).getText().toString();
loader = ((ProgressBar) view.findViewById(R.id.spinWheel2));

filepath = dirpath + udl + ".pdf";
File file = new File(filepath);
if (file.exists()) { 
// If files exists I open it

}else{ // I download it
// There I set the ProgressBar to VISIBLE
loader.setVisibility(View.VISIBLE);
// Call the AsyncTask
final DownloadTask downloadTask = new DownloadTask(CategoryActivity.this);
downloadTask.execute();                 
            }
        }
    });     
}
public static String getUdl(){
    return udl;
}
public static ProgressBar getLoader(){
    return loader;
}

DownloadTask.java(仅限有用部分):

public class DownloadTask extends AsyncTask<Void, Integer, String> {

    public static String url1 = some url;
    private static String url2 = "";
    private static String url3 = CategoryActivity.getUdl();
    public static ProgressBar loader = CategoryActivity.getLoader();
    private static String url = "";
    final static String dirpath = Environment.getExternalStorageDirectory().toString()+ "/SomeDirectory/";
    public static String filepath = "";
    public static final String PREFS_TEXT = "PrefsTextView";

    private Context context;
    public DownloadTask(Context context) {
        this.context = context;
        url3 = CategoryActivity.getUdl();
        loader = CategoryActivity.getLoader();
    }
    @Override
    protected String doInBackground(Void... params) {

        SharedPreferences codeSaveUrl = context.getSharedPreferences(PREFS_TEXT,Context.MODE_PRIVATE);
        url2 = codeSaveUrl.getString("defaut", ""); // Code Organisation
        url = url1 + url2 + "&file=" + url3 ;
        filepath = dirpath + url3 + ".pdf";

            //Download of the file
            HttpHandler hh = new HttpHandler();
            try {
                hh.download(url, filepath, this);
            } catch (MalformedURLException e1) {
                e1.printStackTrace();
            }

        return null;
    }

    public void doProgress(int value){ // Méthode appelée dans HttpHandler
         publishProgress(value);
    }

    @Override 
    protected void onPreExecute() {
        super.onPreExecute();
        StorageDirectory sd = new StorageDirectory();   // Appel à la classe StorageDirectory
        sd.callStorageDirectory();                      // Création du répertoire de stockage sur mémoire externe


    }
    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
    }

    @Override // Evènement de post-execution
    protected void onPostExecute(String result) {
        // There I set the ProgressBar to GONE
        loader.setVisibility(View.GONE);

        if (result != null){
            Toast.makeText(context,"Erreur lors du téléchargement : "+result, Toast.LENGTH_LONG).show();
        }else{
// Note that this message is correctly shown on screen when the download finishes
            Toast.makeText(context,"Le fichier a bien été téléchargé", Toast.LENGTH_SHORT).show();
        }
    }
}

点击它们时会下载每个文件,唯一的问题是旋转的轮子被克隆到其他物品上。

编辑:以下是图片:

当我点击此项目时:

enter image description here

此项目的旋转轮(与第一项同时不在屏幕上)也显示(但文件未下载):

enter image description here

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

ProgressBar Asynctask可见和不可见,或Activity callBack不在Asynctask。如果您使用// Don't set ProgressBar to VISIBLE here //loader.setVisibility(View.VISIBLE); // Call the AsyncTask final DownloadTask downloadTask = new DownloadTask(CategoryActivity.this, loader); downloadTask.execute(); 的任何接口来自asyctask的活动,那么请在活动中进行。

像这样打电话给DownloadTask's

public DownloadTask(Context context, ProgressBar pb) {
  this.context = context;
  this.pb = pb;//also declare pb globaly
  url3 = CategoryActivity.getUdl();
}

像这样改变onPreExecute() constructer

ProgressBar
@Override protected void onPreExecute() { super.onPreExecute(); pb.setVisibility(View.VISIBLE); StorageDirectory sd = new StorageDirectory();// Appel à la classe StorageDirectory sd.callStorageDirectory();// Création du répertoire de stockage sur mémoire externe } 中的

可见onPostExecute(String result)

ProgressBar
pb.setVisibility(View.GONE);//instead of loader.setVisibility(View.GONE); 中的

会更改{{1}}的可见性

{{1}}

修改

尝试将ViewHolder Pattern用于适配器,您也可以查看this also