0

У меня есть список элементов (ItemSong), которые при нажатии начинают загружать (используя Asynctask). У меня есть текстовое представление, показывающее ход загрузки.Android - Textview в Listview обновлено onItemClick, изменения при прокрутке

ItemSong имеет свойство int (percentCompleted), которое отслеживает ход загрузки. DownloadTask обновляет этот int. Таким образом, при прокрутке назад к элементу отображается прогресс. Но он не обновляется постоянно, даже несмотря на то, что DownloadTask запущен, и обновляется% comCompleted.

Все работает нормально, но когда я прокручиваю вниз и назад, т. Е. Элемент перерабатывается, прогресс останавливается. Он показывает последнее обновленное значение только при прокрутке и возврате к элементу.

Я подрезал код до необходимых частей, но если что-то неясно, я добавляю больше или объясняю это.

Любые предложения о том, что я мог, даже если мне нужно изменить весь подход, оценили. Благодарю.

public class ItemSong implements Item{ 

    public final String track_name; 
    public final String album_name; 
    public final String track_num; 
    public final String album_id; 
    public final String album_link; 

    private int percentCompleted = 0; 

    private boolean activeDownload; //false by default 

    public ItemSong(String track_name, String album_name, String track_num, String album_id, String album_link) { 
     this.track_name = track_name; 
     this.album_name = album_name; 
     this.track_num = track_num; 
     this.album_id = album_id; 
     this.album_link = album_link; 
    } 

    @Override 
    public boolean isSection() { 
     return false; 
    } 

    public String itemType() { 
     return "song"; 
    } 

    public void setCompleted(int percent){ percentCompleted = percent; } 

    public int getCompleted() {return percentCompleted;} 

    public void setDownloadStatus(boolean status) {activeDownload = status;} 

    public boolean downloadStatus() {return activeDownload;} 

} 

Мой GetView() класса адаптера: У меня есть набор флаг, который обновляет TextView является загрузка активна. Однако это заставляет приложение замораживать.

TextView percentCompleted = (TextView)v.findViewById(R.id.completed); 

while (itemSong.downloadStatus() == true) 
{ 
    percentCompleted.setText(Integer.toString(itemSong.getCompleted()));} 

onItemClick в моей MainActivity

public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) { 


    ItemSong itemSong = (ItemSong) items.get(position); 

    TextView percentCompleted = (TextView) arg1.findViewById(R.id.completed); 

    new DownloadTask(percentCompleted, itemSong).execute(); 


} 

Класс DownloadTask:

class DownloadTask extends AsyncTask<String, String, String> { 

    private TextView percentComplete; 
    private int prog=0; 
    private ItemSong itemSong; 

    DownloadTask(TextView percentComplete, ItemSong itemSong){ 

     this.percentComplete = percentComplete; 
     this.itemSong = itemSong; 
    } 

    protected String doInBackground(String... f_url) { 

     itemSong.setDownloadStatus(true); 

     while (prog <= 100) { 

      itemSong.setCompleted(prog); 

      publishProgress("" + (prog)); 

      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show(); 
      } 

      prog = prog+10; 
     } 
     return null; 

    } 


    @Override 
    protected void onProgressUpdate(String... progress) { 
     // setting progress percentage 
     percentComplete.setText(progress[0].toString()); 
    } 

    @Override 
    protected void onPostExecute(String file_url) { 

     itemSong.setDownloadStatus(false); 
    } 
} 
+0

вы должны реализовать Hashmap для хранения на позиции элементов прогресса и значении прогресса и в методе GetView из списка адаптера задайте реальные значения после утилизации –

+0

Итак, вы говорите, что прогресс связан с позицией позиции с помощью хэш-карты, поэтому, когда представление переработано в getView, появляется прогресс? Я уже получил это покрытие, потому что значение прогресса хранится как часть свойства элемента. Поэтому, когда представление перерабатывается, появляется прогресс. Но он не продолжает обновляться, если просмотр снова не переработан. Пример: начинается загрузка, и я вижу прогресс. 5-10 и т.д.. Я прокручиваю вниз и прогресс увеличивается до 20%. Я прокручиваю вверх, я вижу 20%, но затем прогресс больше не обновляется, если я не прокручу вниз и не вернусь. – fractal5

+1

Вы вызвали notifydatasetchanged() после обновления обновления? –

ответ

1

, как я сказал в комментарии выше после каждого рецикла, значение прогресса загрузки полей, видимый в ListView, должен быть обновлен. используя некоторый тип массива, например hashMap, прогресс v а также позиции загружаемого элемента должны быть кэшированы в классе адаптера, а затем во время использования используйте их и элементы списка обновления. в данном конкретном случае, после делать это, необходимо вызвать notifyDataSetChanged() в основном потоке программы и AsyncTask в onProgressUpdate:

@Override 
protected void onProgressUpdate(String... progress) { 
    // setting progress percentage 
    percentComplete.setText(progress[0].toString()); 
    yourListView.notifyDataSetChanged();// 
} 
Смежные вопросы