1

Ich habe versucht, verschiedene andere Fragen um Hilfe zu suchen, aber ich kann nicht in der Lage sein, eine Lösung zu finden.Paginierung mit Parse und RecyclerView

OnScrollListener die ich benutze: https://gist.github.com/ssinss/e06f12ef66c51252563e

rvHome.addOnScrollListener(new MainRecyclerViewScrollListener(linearLayoutManager) { @Override public void onLoadMore(int page) { fetchPosts(page); } });

public void fetchOfflinePosts() { 
    offlineListPosts = db.getAllPosts(); 

    for (Post post : offlineListPosts) { 
     listPosts.add(post); 
    } 

    postAdapter.notifyDataSetChanged(); 
} 

public void loadPosts() { 

    if (ConnectivityHelper.isConnected(getContext())) { 
     db.deleteAllPosts(); 
     listPosts.clear(); 
     fetchPosts(0); 
    } else { 
     swipeRefreshLayout.setRefreshing(false); 
    } 

} 

public void fetchPosts(int skip) { 
    ParseQuery<ParseObject> findPostsRequest = new ParseQuery<>("Post"); 
    findPostsRequest.setSkip(skip); 
    findPostsRequest.orderByDescending("createdAt"); 
    findPostsRequest.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> posts, ParseException e) { 

      if (e == null) { 
       for (ParseObject _post : posts) { 
        final Post post = new Post(); 

        String objectId = _post.getObjectId(); 
        String username; 
        String imageUrl;      

        if (_post.getString("username") != null) { 
         username = _post.getString("username"); 
        } else { 
         username = ""; 
        } 

        ParseQuery<ParseUser> findProfilePicQuery = ParseUser.getQuery(); 
        findProfilePicQuery.whereEqualTo("username", username); 
        findProfilePicQuery.findInBackground(new FindCallback<ParseUser>() { 
         @Override 
         public void done(List<ParseUser> users, ParseException e) { 

          if (e == null) { 
           for (ParseUser user : users) { 

            if (user.getParseFile("profilePic") != null) { 
             post.setProfilePicUrl(user.getParseFile("profilePic").getUrl()); 
            } else { 
             post.setProfilePicUrl(""); 
            } 

           } 
          } 

         } 
        }); 

        if (_post.getParseFile("photo") != null) { 
         imageUrl = _post.getParseFile("photo").getUrl(); 
        } else { 
         imageUrl = ""; 
        } 

        post.setObjectId(objectId); 
        post.setUsername(username); 
        post.setImageUrl(imageUrl); 

        db.addPost(post); 
       } 

       fetchOfflinePosts(); 
       swipeRefreshLayout.setRefreshing(false); 
      } 

     } 
    }); 
} 

Durch den Code unter Verwendung der oben ich die RecyclerView bekommen können mehrere Objekte zu laden, sobald der letzte Punkt erreicht ist, aber die Pfosten geholt sind die gleichen wie die, die ich bin schon angekommen. Ich weiß, ich bekomme etwas wirklich einfaches falsch. Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Hier ist ein funktionierendes Beispiel für Paginierung und Aktualisieren von Daten mit Parse:

@Override 
    public void onVideosRequested(final int categoryId, final boolean isRefresh, final int page) { 
     if (!isRefresh && page == 0) { 
      mView.showIndicator(); 
     } 
     ParseQuery<ParseVideo> query = ParseVideo.generateGetVideosByCategoryQuery(categoryId, page, CategoryFragment.VIDEOS_PER_PAGE); 
     query.findInBackground(new FindCallback<ParseVideo>() { 
      @Override 
      public void done(List<ParseVideo> objects, ParseException e) { 
       if (!isRefresh) { 
        if (page == 0) { 
         mView.hideIndicator(); 
        } 
       } else { 
        mView.showHideRefreshLayout(false); 
       } 
       if (e == null) { 
        if (objects != null && objects.size() > 0) { 
         List<ParseVideo> mList = cleanData(objects); 
         List<ParseVideo> mVideos = DashboardActivity.mVideos.get(categoryId); 
         if (page == 0) { 
          mVideos.clear(); 
          mVideos.addAll(mList); 
         } else { 
          mVideos.addAll(mList); 
         } 
         if (objects.size() < CategoryFragment.VIDEOS_PER_PAGE) { 
          mView.isLoadMoreAvailable(false); 
         } else { 
          mView.isLoadMoreAvailable(true); 
         } 
         DashboardActivity.mIndexes.put(categoryId, page); 
         mView.onVideosReceived(mList.size(), page); 
        } else { 
         mView.isLoadMoreAvailable(false); 
        } 
       } else { 
        mView.onDefaultError(e.getLocalizedMessage()); 
       } 
      } 
     }); 
    } 


    @Override 
    public List<ParseVideo> cleanData(List<ParseVideo> data) { 
     List<ParseVideo> mList = new ArrayList<>(); 
     for (ParseVideo pv : data) { 
      if (pv != null && !TextUtils.isEmpty(pv.getName()) && !TextUtils.isEmpty(pv.getId())) { 
       mList.add(pv); 
      } 
     } 
     return mList; 
    } 

In ui Satz Standardvariablen für pagination und refresh:

private int currentPage = 0; 
private boolean isLoadMoreAvailable = true; 

Und Ihren Anruf:

mController.onVideosRequested(mId, false, currentPage); 

Und onLoadMore:

if (isLoadMoreAvailable) { 
    mController.onVideosRequested(mId, false, currentPage + 1); 
} 

Der schwierige Teil mit onLoadMore und Refresh zusammen ist, wenn Sie Ihre Daten aktualisieren müssen Sie Ihre scrollListeners insgesamt und frühere Zählungen zurückgesetzt loadMore noch verfügbar zu halten.

mHidingScrollListener.setPreviousTotal(0); 
mHidingScrollListener.setTotalItemCount(0); 

Schließlich ist hier die parse query:

public static ParseQuery<ParseVideo> generateGetVideosByCategoryQuery(int categoryId, int page, int displayLimit) { 
     ParseQuery<ParseVideo> query = ParseQuery.getQuery(ParseVideo.class); 
     query.whereEqualTo(ParseConstants.IS_DELETED, false); 
     query.addDescendingOrder(ParseConstants.CREATED_At); 
     if (categoryId != ParseConstants.CATEGORY_ID_HOME) { 
      query.whereEqualTo(CATEGORY_ID, categoryId); 
     } 
     query.setLimit(displayLimit); 
     query.setSkip(page * displayLimit); 
     return query; 
    } 
+0

Dank. Ich werde es jetzt ausprobieren. –

+0

Wenn Sie Probleme bei der Implementierung haben, können wir diskutieren. – savepopulation