2010-12-26 8 views
2

Я реализую разбиение на страницы для ListView в Android. Я расширяю класс BaseAdapater для настройки ListView.Застрял в реализации Pagination в Android

У меня уже есть код, который отлично подходит для настраиваемого ListView. Ниже приведено новое требование.

1> Я извлекаю 6 элементов с сервера &, показывая их. Теперь, когда пользователь прокручивает к 6-й пункт (конец списка), нужно вызвать сервер, чтобы принести следующие 6 пунктов & обновлять ListView

Я переопределены методы

I> общественности недействительным OnScroll (AbsListView вид, внутр firstVisibleItem, внутр visibleItemCount, внутр totalItemCount)

II> общественная пустота onScrollStateChanged (вид AbsListView, внутр scrollState)

В первом ответе от сервера, я получаю не полная нет страниц с сервера & за каждый раз, когда я звоню в сервисный r, я получаю текущее значение страницы.

Просьба предоставить мне шаги/пример кода, как проверить последний элемент списка & обновить список. Код должен быть итеративным, так как мне может потребоваться многократное вызов & выборки с сервера.

теплыми пожеланиями,

CB

ответ

1

Почему бы не просто скачать все это в фоновом режиме, а не делать это каждый раз, когда есть запрос? У меня есть приложение, в котором я думал, что делаю то же самое, что вы делаете, но решил использовать фоновый поток, чтобы сделать это вместо этого.

Вот отличный пример того, как использовать нити

http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/

Как я реализовал это было то, что я получить общее количество записей, доступных первыми, а затем начать новую тему для каждой «страницы» записи, которые я хочу получить.

// Create and launch the download thread 
    downloadThread = new DownloadThread(this); 
    downloadThread.start(); 

    // Create the Handler. It will implicitly bind to the Looper 
    // that is internally created for this thread (since it is the UI 
    // thread) 
    handler = new Handler(); 

    resultCount = getResultCount(search).trim(); 
    resultsCount = Integer.parseInt(resultCount); 
    page = 1; 
    if (resultsCount > 0) { 
     downloadThread 
       .enqueueDownload(new DownloadTask(page)); 
    } 

Я добавил свой метод для получения записей в DownloadTask.java из приведенного выше примера, и называют его от запуска(), и я добавил еще один публичный метод для получения результатов, как только

Я модифицированные DownloadThread. Java, так что синхронизируются вызов к задаче (DownloadTask) называет свой метод в DownloadTask >> task.run() и, наконец, {} я получить возвращаемые результаты

public synchronized void enqueueDownload(final DownloadTask task) { 
    // Wrap DownloadTask into another Runnable to track the statistics 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       task.run(); 
      } finally {     
       // register task completion 
       synchronized (DownloadThread.this) { 
        results = task.getResults(); 
        totalCompleted++; 
       } 
       // tell the listener something has happened 
       signalUpdate(); 
      }    
     } 
    }); 

Затем я добавил новый метод DownloadThread.java что позволяет мне получить результаты fr О.М. уведомление об обновлении в моей деятельности

public synchronized ArrayList<Result> getResults() { 
    return results; 
} 

Например, если есть 60 записей, и каждая страница содержит 6 записей, я начинаю поток, чтобы получить первые 6, а затем, когда handleDownloadThreadUpdate() называется я наполнитьсетевой массив с этими результатами и вызовите метод в моем адаптере, называемый update(), который вызывает notifyDataSetChanged().

public void handleDownloadThreadUpdate() { 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      for (Result res : downloadThread.getResults()) { 
       if (!results.contains(res)) { 
        results.add(intern(res)); 
       } 
      } 
      arrayAdapter.update(); 
      int pages = (int) Math.ceil(resultsCount/6); 
      if (page < pages) { 
       page = page + 1; 
       downloadThread.enqueueDownload(new DownloadTask(page)); 
      } 
     } 
    }); 
} 

Таким образом, он рекурсивно загружает страницы и добавляет результаты в мой список.

Еще одна вещь, о которой я забыл упомянуть. У меня есть класс под названием Result, который содержит каждый результат, который я храню в ArrayList. На всякий случай, если результаты попытаются использовать слишком много памяти, я кэширую их в WeakReference HashMap ..., поскольку вы можете увидеть вызов intern(), когда он добавлен в ArrayList выше.

private Map<Result, WeakReference<Result>> myInternMap = new HashMap<Result, WeakReference<Result>>(); 

public Result intern(Result value) { 
    synchronized (myInternMap) { 
     WeakReference<Result> curRef = myInternMap.get(value); 
     Result curValue = ((curRef != null) ? curRef.get() : null); 
     if (curValue != null) { 
      return curValue; 
     } 

     myInternMap.put(value, new WeakReference<Result>(value)); 
     return value; 
    } 
} 
Смежные вопросы