2013-02-28 3 views
1

Я использую абсурдно простой EndlessAdapter для загрузки выгружаемых данных из Facebook. В моем проекте EndlessAdapter, чтобы обернуть обычай BaseAdapter. Я также использую PullToRefreshListView, который из этого library. Все загружается нормально для запуска, я получаю данные для загрузки следующей страницы, я прокручиваю нижнюю часть списка, следующую страницу данных загружает и заполняет, но когда я снова прокручиваю нижнюю часть, ничего не происходит. У меня есть проверки журналов для методов, и chacheInBackground() не запускается вообще после первой успешной загрузки страницы.EndlessAdapter загружает только одну страницу

Я думал, что это может быть связано с библиотекой «pull to refresh», и адаптер не может обнаружить позицию ListView или что-то в этом роде, поэтому я избавился от «pull to refresh» и все еще имел ту же проблему ,

Вот соответствующий код:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    view = inflater.inflate(R.layout.news_feed, container, false); 
    if(appState.getNewsFeed()==null){ 
     refreshListener.onRefresh(refreshFeedList); 
     Log.i("NewsFeed", "executing Request"); 
     if(appState.lastFeed().contains("lastFeed") && feedAdapter == null){ 
      try { 
       String lastFeedString = appState.lastFeed().getString("lastFeed", "null"); 
       JSONObject lastFeedObject = new JSONObject(lastFeedString); 
       JSONArray lastFeedArray; 
       lastFeedArray = lastFeedObject.getJSONArray("data"); 
       appState.setNewsFeed(lastFeedArray); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      updateFeed(); 
     } 
    } 
    else{ 
     Log.i("NewsFeed", "recreating adapters from existing data"); 
     updateFeed(); 
    } 

    return view; 
} 

public void updateFeed(){ 
    refreshFeedList = (PullToRefreshListView) view.findViewById(R.id.feedList); 
    feedList = refreshFeedList.getRefreshableView(); 
    feedList.setDividerHeight(0); 
    feedAdapter = new FeedAdapter(getActivity(), appState.getNewsFeed()); 
    endlessAdapter = new EndlessFeed(feedAdapter); 
    refreshFeedList.setAdapter(endlessAdapter); 
    refreshFeedList.setOnRefreshListener(refreshListener); 
    refreshFeedList.setOnItemClickListener(itemClickListener); 
} 

public class EndlessFeed extends EndlessAdapter { 

    @Override 
    protected View getPendingView(ViewGroup parent) { 
     Log.i("NewsFeed", "running getPendingView()"); 
     View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_view, null); 
     return (row); 
    } 

    public EndlessFeed(BaseAdapter wrapped) { 
     super(wrapped); 
    } 

    @Override 
    protected boolean cacheInBackground() throws Exception { 
     Log.i("NewsFeed", "running cacheInBackground()"); 
     nextPageRequest.setCallback(nextPageCallback); 
     nextPageRequest.executeAndWait(); 
     return false; 
    } 

    @Override 
    protected void appendCachedData() { 
     try { 
      appState.addToNewsFeed(requestResponse); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
//   onDataReady(); 
    } 
} 

JSONArray посланный в адаптер сохраняется в глобальной переменной с получения и установки методов в Application подкласса.

Поскольку я воссоздаю адаптеры и вызвать setAdapter() в методе onCreateView(), если перейти к другому фрагменту (с помощью одного из интерактивных вещей в ListView), а затем вернуться обратно к этому фрагменту, он будет загрузить другую страницу данные. Есть идеи? Благодарю.

ответ

3

Ответ однозначен в CommonsWare-х documentation о том, как EndlessAdapter будет intented работать:

Ваш EndlessAdapter подкласс также необходимо реализовать cacheInBackground(). (...) Этот метод возвращает значение boolean, , которое должно быть истинным, если должно быть правдой, если еще не получено данных., false в противном случае.

Поскольку вы всегда возвращаются false из cacheInBackground(), он никогда не будет работать снова после того, как в первый раз. Следовательно, он только загружает больше данных один раз при прокрутке вниз.

+0

Ahhh thanks. Я воспринял это утверждение как означающее, что вы должны вернуть 'false', если эта страница будет загружена, а не если все это не будет загружено больше. – Wenger

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