【问题标题】:Spinning wheel Progress Bar cloned in ListView在 ListView 中克隆的纺车进度条
【发布时间】:2014-10-16 02:45:02
【问题描述】:

我有一个 ListView,其中包含作为项目的文件。当我单击一个项目时,会启动一个 AsyncTask,下载文件。 现在,在下载文件时,我在 ListView 中的名称旁边有一个 ProgressBar。

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

CategoryActivity.java(ListView的Activity,只有有用的部分):

@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();
        }
    }
}

当我点击它们时,每个文件都会被下载,唯一的问题是旋转轮被克隆到其他项目上。

编辑:这是图片:

当我点击这个项目时:

这个项目的旋转轮(它没有和第一个同时出现在屏幕上)也显示(它的文件没有下载):

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    ProgressBar 可见和不可见,或者在 Asynctask 中消失,而不是在 Activity 中。如果您使用callBack 的任何接口从 asyctask 进行活动,请在活动中执行。

    像这样拨打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();
    

    像这样更改DownloadTask's构造函数

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

    在onPreExecute()可见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);
    

    编辑:

    尝试使用ViewHolder Pattern作为适配器,你也可以看看this also

    【讨论】:

    • ProgressBar 仍然克隆在另一个项目上,有些甚至不再消失。
    • 确保在 xml 中你有 setvisibility 离开
    • 平板上不会出现这个问题,所以我认为是由于第二项超出了屏幕。
    • 但代码在onItemClick 中,当onItemClick 被触发时,代码将执行。
    • 即使使用onItemClick 中的代码,如果屏幕外有项目,它们的微调器也会出现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多