11

Как мы можем обновить индикатор выполнения в ListView. Когда каждый индикатор выполнения связан с загрузкой файла и выполняется через AsyncTask.Обновить индикатор выполнения в списке для нескольких файлов загрузить

Функция будет:

  1. Каждый индикатор будет обновление с процессом загрузки.
  2. Когда файл будет загружен, он будет сохранен в SD-карте.
  3. Он будет добавлен его службы (работает на заднем плане.
  4. Когда один файл, загруженный он должен показать «Complete» (не следует удалить форму ListView)

Я также использовал базу данных для загрузки .. список file.The также зависит от вектора базы данных Как я могу реализовать его я тоже пытался, но не получить решение

Ниже приведены два скриншота, чтобы описать его в деталях:.

enter image description here

Я также попробовал этот код:

temp = databaseHandler.getAllNotifyNumber(); 
list_download = (ListView) findViewById(R.id.list_download); 
myCustomAdapter = new MyCustomAdapter(mContext); 
list_download.setAdapter(myCustomAdapter); 
myCustomAdapter.notifyDataSetChanged(); 

for (int index = 0; index < temp.size(); index++) { 
    String url = "http://upload.wikimedia.org/wikipedia/commons/0/05/Sna_large.png"; 
    grabURL(url); 
} 

Это AsyncTask Mathod:

public void grabURL(String url) { 
    new GrabURL().execute(url); 
} 

private class GrabURL extends AsyncTask<String, Integer, String> { 

    protected String doInBackground(String... urls) { 

     String filename = "MySampleFile.png"; 
     File myFile = new File(directory, filename); 

     try { 
      URL url = new URL(urls[0]); 
      URLConnection connection = url.openConnection(); 
      connection.connect(); 
      int fileSize = connection.getContentLength(); 

      InputStream is = new BufferedInputStream(url.openStream()); 
      OutputStream os = new FileOutputStream(myFile); 

      byte data[] = new byte[1024]; 
      long total = 0; 
      int count; 
      while ((count = is.read(data)) != -1) { 
       total += count; 
       publishProgress((int) (total * 100/fileSize)); 
       os.write(data, 0, count); 
      } 

      os.flush(); 
      os.close(); 
      is.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return filename; 

    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     // home_countprogress.setVisibility(View.VISIBLE); 
     // home_countprogress.setText(String.valueOf(progress[0]) + "%"); 
     // progressbar_horizontal.setProgress(progress[0]); 
     myCustomAdapter.notifyDataSetChanged(); 
    } 

    @Override 
    protected void onCancelled() { 
     Toast toast = Toast.makeText(getBaseContext(), 
       "Error connecting to Server", Toast.LENGTH_LONG); 
     toast.setGravity(Gravity.TOP, 25, 400); 
     toast.show(); 

    } 

    @Override 
    protected void onPostExecute(String filename) { 
     // progressbar_horizontal.setProgress(100); 
     // home_countprogress.setVisibility(View.VISIBLE); 
    } 

    protected void onPreExecute() { 
     // progressbar_horizontal.setVisibility(View.VISIBLE); 
     // progressbar_horizontal.setProgress(0); 
     // home_countprogress.setVisibility(View.VISIBLE); 

     myCustomAdapter = new MyCustomAdapter(mContext); 

    } 
} 
+0

Вы получили эту работу в соответствии с раствором ниже. Если да, то дайте мне знать, так как у меня такая же проблема с реализацией. В моей ситуации есть также кнопка «Загрузить все», которая должна показывать множественные полосы хода вращения для каждого элемента списка. – Sriram

ответ

2

Вместо уведомления адаптер каждый раз, когда изменения прогресса (который все время) и сделать это полностью неэффективны, вы можете попытаться сделать следующее.

  • Создание настраиваемого представления для каждой строки в ListView
  • Добавьте метод там под названием «УстановитьДанные()» или что-то. Вызвать это в обратном вызове getView() адаптера, установив данные для этого представления.
  • Внутри 'setData()' регистрируют это представление как слушателя для обновлений прогресса из задачи async.
  • Переопределить onStartTemporaryDetach() и onDetachedFromWindow() внутри вашего пользовательского представления. Убедитесь, что вы отменили регистрацию от обновлений асинхронной задачи там (иначе вы получите утечку памяти).
  • В вашей асинхронной задаче просто уведомите всех зарегистрированных слушателей (которые, вероятно, хранятся на карте URL-адресов слушателям или что-то в этом роде).
0

Вместо того, чтобы использовать ListView попробовать это:

создать макет, который содержит ваши вещи + ProgresseBar это будет похоже, как тот

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:padding="3dp"> 

<TextView 
    android:id="@+id/text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

<ProgressBar 
    android:id="@+id/progressBar" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/image" 
    android:visibility="gone" /> 

</LinearLayout> 

и в макете вашей деятельности/фрагмента заменить ListView по LinearLayout (или LinearLayout внутри ScrollView) с теми же свойствами, как ваш ListView:

<ScrollView 
    android:id="@+id/scrollView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <LinearLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 
    </LinearLayout> 
</ScrollView 

и в вашей деятельности создать функцию:

private void addMyView(String url){ 
    LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View mView     = mInflater.inflate(R.layout.my_layout, null, false); 
    ProgressBar mBar   = (ProgressBar) mView.findViewById(R.id.progress); 

    container.addView(mView); 

    grabURL(url); // starting your task here 

}

Также не забыли LinearLayout:

LinearLayout container   = (LinearLayout) findViewById(R.id.container); 

затем:

for (int index = 0; index < temp.size(); index++) { 
    String url = "http://upload.wikimedia.org/wikipedia/commons/0/05/Sna_large.png"; 
    addMyView(url);`enter code here 
} 

Надежда, что помогает :)

Смежные вопросы