下载时更新ListView中的进度条

     2023-05-07     225

关键词:

【中文标题】下载时更新ListView中的进度条【英文标题】:Update the Progress Bar in the ListView when downloading 【发布时间】:2015-11-01 02:25:43 【问题描述】:

我有一个显示数据库记录列表的活动。 在这个活动中有一个自定义的 ListView。 在自定义 ListView 中,有一个 Button 和一个 TextView 和一个 ProgressBar 。 我调用 AsyncTask 的按钮侦听器位于 CustomAdapter 类中。

DownloadTask downloadTask = new DownloadTask(getContext());
                downloadTask.execute(url[position].toString());

AsynkTask 工作得很好。 但我想在下载过程中更新进度条。 我已经在互联网上搜索了三天,但没有成功。 对不起我的英语

public class listanimals extends ActionBarActivity 
private MyDatabase MyDataBase;
String[]  listurl;
ProgressBar progressBar;
TextView url2;
CustomList adapter;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////

public class DownloadTask extends AsyncTask<String, Integer, String> 
    private Context context;
    int myProgress;
    public DownloadTask(Context context) 
        this.context = context;
    

    @Override
    protected String doInBackground(String... sUrl) 

        InputStream input = null;
        final GlobalClass caches = (GlobalClass) context.getApplicationContext();
        OutputStream output = null;
        HttpURLConnection connection = null;

        try 
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();


            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) 
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            


            input = connection.getInputStream();
            output = new FileOutputStream("/sdcard/"+caches.getName_cach()+".mp3");

            byte data[] = new byte[4096];
            long total = 0;
            int count;

            while ((count = input.read(data)) != -1) 
                total += count;

                myProgress = (int)(total*100/connection.getContentLength());

                output.write(data, 0, count);

            
         catch (Exception e) 
            return e.toString();
         finally 
            try 
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
             catch (IOException ignored) 
            

            if (connection != null)
                connection.disconnect();
        
        return null;
    
    @Override
    protected void onProgressUpdate(Integer... values) 
     //MY PROBLEM MAY HERE
        progressBar.setProgress(myProgress);
    
    @Override
    protected void onPostExecute(String result) 
        final GlobalClass caches = (GlobalClass) context.getApplicationContext();

        if (result != null)
            Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show();

        else
            Toast.makeText(context,"File downloaded"+ "" + caches.getName_cach(), Toast.LENGTH_SHORT).show();

        
    


/////////////////////////////////////////////////////////////////////////////////////////////////////////////AsynkTask end
///////////////////////////////////////////////////////////////////////////////////////
@Override
protected void onCreate(Bundle savedInstanceState) 


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listanimals);
    MyDataBase = new MyDatabase(this);
    final GlobalClass caches = (GlobalClass) getApplicationContext();
    final ListView listView=(ListView)findViewById(R.id.listView);


    SQLiteDatabase mydb = MyDataBase.getReadableDatabase();

    Cursor cursor = mydb.rawQuery("select * from animals", null);

    ArrayList<String> myList = new ArrayList<String>();
   final ArrayList<String> myListname = new ArrayList<String>();
    ArrayList<String> myListurl = new ArrayList<String>();

    try 
        while(cursor.moveToNext()) 

            myList.add(cursor.getString(cursor.getColumnIndex("_id")));
            myListname.add(cursor.getString(cursor.getColumnIndex("name")).trim());
            myListurl.add(cursor.getString(cursor.getColumnIndex("url")));

            String[] listname = new String[myListname.size()];
            listname = myListname.toArray(listname);

            listurl = new String[myListurl.size()];
            listurl = myListurl.toArray(listurl);

            String[] listid = new String[myList.size()];
            listid = myList.toArray(listid);

             adapter = new
                    CustomList(listanimals.this, listname,listurl);
            listView.setAdapter(adapter);

     finally
        mydb.close();
    

@Override
public boolean onCreateOptionsMenu(Menu menu) 
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) 
        return true;
    

    return super.onOptionsItemSelected(item);


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////

public class CustomList extends ArrayAdapter<String> 

    private MyDatabase MyDataBase;

    private final Activity context;
    private final String[] web;
    private final String[] url;
    public CustomList(Activity context,
                      String[] web,String[] url) 
        super(context, R.layout.list_file, web);
        this.context = context;
        this.web = web;
        this.url = url;
    



    @Override
    public View getView(final int position, View view, final ViewGroup parent) 
        final GlobalClass caches = (GlobalClass) context.getApplicationContext();

        MyDataBase = new MyDatabase(getContext());

        LayoutInflater inflater = context.getLayoutInflater();
        View rowView= inflater.inflate(R.layout.list_file, null, true);
        Typeface kamran= Typeface.createFromAsset(context.getAssets(), "IranNastaliq.ttf");
        progressBar=(ProgressBar)rowView.findViewById(R.id.progressBar);
        TextView txtTitle3 = (TextView) rowView.findViewById(R.id.textView);
        txtTitle3.setTypeface(kamran);
        url2=(TextView)rowView.findViewById(R.id.textView2);
        url2.setText(url[position]);
        txtTitle3.setText(web[position]);
        Button download=(Button)rowView.findViewById(R.id.button);



        download.setTag(position);// Any data associated with the button has to be added with          setTag()

        download.setOnClickListener(new View.OnClickListener() /////////call AsynkTask
            @Override
            public void onClick(View arg0) 
            caches.setName_cach(web[position]);
                DownloadTask downloadTask = new DownloadTask(getContext());
                downloadTask.execute(url[position].toString());


            
        );

        return rowView;

     


 


【问题讨论】:

【参考方案1】:

您需要从 doInBackground 方法中调用 publishProgress 来更新 ProgressBar:publishProgress docs

这将调用 onProgressUpdate(Integer... values);

您不需要 myProgress 实例变量;

【讨论】:

如果解决了您的问题,请标记为正确答案。 谢谢老哥。我试过了。但是当进度条处于活动状态时,此方法有效。当进度条处于自定义列表布局时,这不起作用。解决办法是什么? @AmirGheybi 您的 ProgressBar 是 listAnimals 类的实例变量。它应该在该类的 onCreate 方法中实例化。 我疯了。四天来做,但我没有。您可以对我的代码进行必要的更改吗?谢谢 @AmirGheybi 我不会为你编写代码,但文档中有一个很好的例子:developer.android.com/reference/android/widget/ProgressBar.html【参考方案2】:

查看此链接https://www.youtube.com/watch?v=5HDr9FdGIVg&list=PLonJJ3BVjZW6hmkEaYIvLLm5IEGM0kpwU&index=17

你需要调用 - publishProgress((int) total*100/connection.getContentLength());

在while循环中 更新您的进度条。希望对您有所帮助。

【讨论】:

谢谢兄弟。视频很不错。我尝试过这个 。但是当进度条处于活动状态时,此方法有效。当进度条处于自定义列表布局时,这不起作用。解决办法是什么?【参考方案3】:

您在列表的每个项目中都有一个进度条,而您在活动中保留一个实例。这意味着您的进度视图将指向系统要求您绘制的最后一个列表项中的那个。这可能不是您按下按钮的列表项中的那个。我建议您拆分课程(将它们从活动中删除),您会更好地看到您的问题。但这只是您的第一个问题 - 因为您启动了异步任务,同时您可以将该项目滚动到屏幕外。

【讨论】:

androidlistview嵌套progressbutton更新进度条

最近在做项目开发的时候,遇到listview中嵌套下载进度条。点击下载是的时候,进度条更新顺序混乱解决办法如下://设置进度条显示的百分比publicvoidpublishProgress(finalintpositionInAdapter,finalfloatprogress)if(positionInAdapter>... 查看详情

当 UITableView 单元格中的进度条不可见时,如何更新它们

...表。通过单击单元格上的按钮,我已成功实现将这些文件下载到设备。点击后,单元格上会出现一个 查看详情

如何在service中同步更新通知activity中的进度条

目前做一个下载功能,需要在service中同步更新notification中的进度条和某一个activity中的进度条,notification中显示所有下载项的下载进度,单击某一下载进度条,启动本下载项目的详细下载界面,包含当前下载项的下载进度条和下... 查看详情

如何使用界面更新异步任务中的进度条

...一个应用程序,其中我使用了Fragment类和另一个Async类来下载两个不同的类现在我必须显示进度条水平更新进度条在onProgressUpdate中发生了多少下载。但是onProgressUpdate回调不起作用的接 查看详情

无法加载 ListView 的内容时如何关闭 Android 的进度条?

】无法加载ListView的内容时如何关闭Android的进度条?【英文标题】:HowtodismissAndroid\'sprogressbarwhenfailedtoloadaListView\'scontents?【发布时间】:2015-02-1712:12:41【问题描述】:我有一个扩展RoboListFragment的类,它使用管理器类来获取一些... 查看详情

来自Task的tableview中的JavaFX更新进度条

...进度条作为对象。我的程序有一个TableView。一旦用户输入下载url并单击下载在TableView中创建的 查看详情

UWP 进度条和绑定

...怪的情况。基本上,我有SemanticZoom,在ZoomedIn模式下我有ListView。每个ListView都包含ProgressBar。这是最有趣的。工作(我设定的值):<ProgressBarMinimum="1488240000"M 查看详情

更新 Tkinter 进度条

...8-11-0221:56:18【问题描述】:我已经制作了一个用于从网站下载许多文件的python脚本,我想在Tkinter中制作一个进度条,当每个文件保存到计算机时它应该会更新。我已经看到了一些使用OOP的示例,但我仍在掌握OOP,并且有朝一日... 查看详情

从android中的json get方法下载数据时使用百分比设置进度条

】从android中的jsonget方法下载数据时使用百分比设置进度条【英文标题】:SetProgressbarwithpercentagewhendatadownloadfromjsongetmethodinandroid【发布时间】:2018-03-1721:00:45【问题描述】:我想显示进度条,显示从json下载数据的百分比。现在... 查看详情

NSURLSession 下载任务 - 进度条问题

】NSURLSession下载任务-进度条问题【英文标题】:NSURLSessionDownloadTask-ProgressBarIssue【发布时间】:2016-05-0406:14:40【问题描述】:我正在处理一个非ARC项目,我必须在其中下载视频,下载后我将显示它们。我正在使用NSURLSession下载它... 查看详情

第一次进入片段ListView时AsyncTask更新progressBar的进度失败,滚动ListView后就ok了

】第一次进入片段ListView时AsyncTask更新progressBar的进度失败,滚动ListView后就ok了【英文标题】:FailtoAsyncTaskupdateprogressBar\'sprogresswhenfirstenterthefragmentListView,thenokayafterscrollListView【发布时间】:2017-02-0209:57:50【问题描述】:如果没... 查看详情

聊天界面之进度条cell

ProgressCell用于显示文件传输的进度,困难点在于根据下载进度更新cell的进度条,先后尝试了几种方法:1.有新的下载进度时,直接调用reloadData()2.使用reloadRowsAtIndexPaths(),只更新进度条所在的cell这两种方法其实都是重新生成cell... 查看详情

uitableview中的ios进度条

...11-2113:46:53【问题描述】:我是ios新手,如何在uitableview中更新进度条。通常我有一个按钮,当我单击特定单元格中的按钮时,我只需要在该单元格中显示进度条,请帮助我并提前致谢-(UITableViewCell*)tableView:(UITableView*)tableViewcell 查看详情

表单最小化时在任务栏中显示进度条

...进度条逐渐变成绿色的?谁能告诉我该怎么做?更新:我下载了windowsapi代码包并在我的项目 查看详情

持续时间长于更新时的 Qt 进度条动画

】持续时间长于更新时的Qt进度条动画【英文标题】:QtProgressBarAnimationWhenDurationisLongerThanUpdate【发布时间】:2020-08-1018:59:02【问题描述】:我正在定制一个Qt5Quick2QML进度条。当进度更新很少且很大时,进度条会以块状方式跳跃。... 查看详情

带有进度条下载更新的自定义 UITableViewCell

】带有进度条下载更新的自定义UITableViewCell【英文标题】:CustomUITableViewCellwithProgressBardownloadupdate【发布时间】:2014-01-1509:28:56【问题描述】:我正在尝试使用进度条加载更新每个表格单元格,但我被卡住了。我为具有以下属性... 查看详情

如何更新异步任务中的进度条

】如何更新异步任务中的进度条【英文标题】:HowtoupdateprogressbarinAsyncTask【发布时间】:2014-11-1607:46:40【问题描述】:我正在为android构建一个简单的备份应用程序,此代码读取手机内存中的所有消息并将其存储到一个csv文件中... 查看详情

更新原始活动中的集成进度条

】更新原始活动中的集成进度条【英文标题】:Updateintegratedprogressbarinoriginalactivity【发布时间】:2010-11-1506:28:58【问题描述】:我一直在尝试让我的进度条视图在我的文件扫描器应用程序中工作,但我完全被活动、服务、线程和... 查看详情