我有一个ListView,其中每个项目代表一个PDF文件.当用户单击某个项目时,该应用程序必须在外部存储上下载该文件.现在下载无法正常运行,但这不是问题.我想要一个ProgressBar,旋转轮样式,在下载文件时出现在列表的每个项目旁边.
我的问题是:我找不到如何使纺车出现.在下载管理器之前,我尝试使用AsyncTask并且旋转轮工作.
这是我的代码:
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(); // This is the spinning wheel loader = ((ProgressBar) view.findViewById(R.id.spinWheel2)); filepath = dirpath + udl + ".pdf"; File file = new File(filepath); if (file.exists()) { // If the file exists, I open it }else{ // Else I download it // Setting the spinning wheel to VISIBLE loader.setVisibility(View.VISIBLE); SharedPreferences codeSaveUrl = getSharedPreferences(PREFS_TEXT,Context.MODE_PRIVATE); url2 = codeSaveUrl.getString("defaut", ""); // Code Organisation // Constructing the uriString uri = url10 + url2 + "&file=" + udl ; Uri myuri = Uri.parse(uri); DownloadManager mgr=(DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE); mgr.enqueue(new DownloadManager.Request(myuri) .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |DownloadManager.Request.NETWORK_MOBILE) .setAllowedOverRoaming(false) .setTitle(udl + ".pdf") .setDescription("Téléchargement en cours") .setDestinationInExternalPublicDir("/Protocols/", (udl+".pdf")) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)); // Hiding the spinning wheel loader.setVisibility(View.GONE); } }
请注意,如果我不使纺车轮消失,点击该项目后它将始终可见.使用隐藏它的行,它甚至不会出现.
编辑:
我添加了一个BroadcastReceiver.
将这两行放在onCreate()中:
final DownloadManager mgr=(DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE); registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
并补充说:
BroadcastReceiver onComplete = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { loader.setVisibility(View.GONE); } }; @Override public void onDestroy(){ super.onDestroy(); unregisterReceiver(onComplete); }
编辑2: 好的,这是我做的一些改变:
我将下载的ID保存在变量中:
lastDownload = mgr.enqueue(new DownloadManager.Request(myuri) .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |DownloadManager.Request.NETWORK_MOBILE) .setAllowedOverRoaming(false) .setTitle(udl + ".pdf") .setDescription("Téléchargement en cours") .setDestinationInExternalPublicDir("/Protocols/", (udl+".pdf")) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED));
根据下载的状态,我想做不同的事情:
BroadcastReceiver onComplete = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { Cursor c = mgr.query(new DownloadManager.Query().setFilterById(lastDownload)); if(c.moveToFirst()){ int x = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); switch(x){ case DownloadManager.STATUS_PAUSED: case DownloadManager.STATUS_PENDING: case DownloadManager.STATUS_RUNNING: break; case DownloadManager.STATUS_SUCCESSFUL: loader.setVisibility(View.GONE); break; case DownloadManager.STATUS_FAILED: //TODO: retry download break; } } } };
问题是,旋转轮只隐藏在listView中单击的最后一个项目.我尝试使用调试模式,但该程序具有正确的行为(loader.setVisibility(View.GONE)
每次下载都会调用该含义).我不知道为什么除了点击的最后一项外,纺车不会隐藏.
编辑:3 我知道为什么除了点击的最后一项外,纺车不会隐藏.
当我点击多个项目时,lastDownload会获取最后一个项目的ID.因此,在广播接收器中,它点击最后一个项目的情况下点击了项目的数量.
我尝试将lastDownload更改为longs数组/表,并将其与referenceId进行比较,我相信它是intent中包含的id.
这是新代码(y = 0,ld是单击的项目数):
BroadcastReceiver onComplete = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); if(y我没有编写将变量放回0的部分,但是现在代码几乎按预期工作.剩下的唯一问题是我制造的纺车消失了最后一个项目的纺车轮点击.而且我知道为什么.因为这一行:
loader = ((ProgressBar) view.findViewById(R.id.spinWheel2));
位于onItemClicked
方法中.我不认为我可以把它放在其他地方,因为它所在的视图不是活动的视图.简而言之:我必须找到一种方法来访问我点击的项目/视图的进度条,知道我可以在第一个到达广播接收器之前点击多个项目.
编辑:4好的所以我这样做了:
y
,z
和ld
被设置为0
在开始时.单击某个项目时:
// Loader of the clicked item is made visible loader[z].setVisibility(View.VISIBLE); // Construction of the URL SharedPreferences codeSaveUrl = getSharedPreferences(PREFS_TEXT,Context.MODE_PRIVATE); url2 = codeSaveUrl.getString("defaut", ""); // Organization code uri = url10 + url2 + "&file=" + udl ; // URL parse to URI Uri myuri = Uri.parse(uri); // Enqueue file to downloads, with notification. Storage of download id in a table lastDownload[ld] = mgr.enqueue(new DownloadManager.Request(myuri) .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |DownloadManager.Request.NETWORK_MOBILE) .setAllowedOverRoaming(false) .setTitle(udl + ".pdf") .setDescription("Téléchargement en cours") .setDestinationInExternalPublicDir("/Protocols/", (udl+".pdf")) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)); // Increment variables for next downloads ld=ld+1; z=z+1;广播接收器:
// Broadcast Receiver called when a download is finished BroadcastReceiver onComplete = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { // referenceId is the download's id for which the method is called long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); // If y (=0 at the beginning) is inferior to the number of downloads if(y工作正常,除非在下载大文件时单击一个小文件的项目.小文件优先,下载管理器不再遵循表的顺序,导致加载轮不会消失.
编辑:5
我找到了一种方法来做我想做的事,看看我的回答.
谢谢你的帮助.