我有一个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();
}
}
}
点击它们时会下载每个文件,唯一的问题是旋转的轮子被克隆到其他物品上。
编辑:以下是图片:
当我点击此项目时:
此项目的旋转轮(与第一项同时不在屏幕上)也显示(但文件未下载):
感谢您的帮助。
答案 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