0

I持って私の主な活動ののonCreateメソッド内の項目のリストを照会し、私のアダプタにそれらを設定し、次の方法:onBindViewHolder新しいデータ(Parse/Android)のみをクエリする方法はありますか?

private void retrieveYeets() { 
     String groupId = ParseUser.getCurrentUser().getString("groupId"); 
     ParseQuery<ParseObject> query = new ParseQuery<>(ParseConstants.CLASS_YEET); 
     query.whereContains(ParseConstants.KEY_GROUP_ID, groupId); 
     query.orderByDescending("lastReplyUpdatedAt"); 
     query.setLimit(1000); 
     query.findInBackground((yeets, e) -> { 

      if (mSwipeRefreshLayout.isRefreshing()) { 
       mSwipeRefreshLayout.setRefreshing(false); 
      } 

      if (e == null) { 

       // We found messages! 
       mYeets = yeets; 
       /*System.out.println(yeets);*/ 

       FeedAdapter adapter = new FeedAdapter(getContext(), yeets); 
       adapter.setHasStableIds(true); 
       mRecyclerView.setHasFixedSize(true); 
       adapter.notifyDataSetChanged(); 
       mRecyclerView.setAdapter(adapter); 
      } 
     }); 
    } 

、私はから追加データを取得する方法を持っています投稿者のユーザー名、フルネーム、およびプロフィール画像などのポインタ、:

private void downloadProfilePicture(ViewHolder holder, ParseObject yeet) { 
     ParseQuery<ParseUser> query = ParseUser.getQuery(); 
     query.whereEqualTo(ParseConstants.KEY_OBJECT_ID, yeet.getParseObject(ParseConstants.KEY_SENDER_AUTHOR_POINTER).getObjectId()); 
     query.findInBackground((user, e) -> { 
      if (e == null) for (ParseObject userObject : user) { 

       if (userObject.getParseFile("profilePicture") != null) { 
        String profilePictureURL = userObject.getParseFile("profilePicture").getUrl(); 

        // Asynchronously display the profile picture downloaded from Parse 
        if (profilePictureURL != null) { 

         Picasso.with(mContext) 
           .load(profilePictureURL) 
           .networkPolicy(NetworkPolicy.OFFLINE) 
           .placeholder(R.color.placeholderblue) 
           .fit() 
           .into(holder.profilePicture); 

        } else { 
         holder.profilePicture.setImageResource(Integer.parseInt(String.valueOf(R.drawable.ic_profile_pic_add))); 
        } 
       } 

       if (!(userObject.getString(ParseConstants.KEY_AUTHOR_FULL_NAME).isEmpty())) { 
        holder.fullName.setText(userObject.getString(ParseConstants.KEY_AUTHOR_FULL_NAME)); 
       } else { 
        holder.fullName.setText("Anonymous Lose"); 
       } 

       holder.username.setText(userObject.getString(ParseConstants.KEY_USERNAME)); 

      } 
     }); 
    } 

重要な部分は次のとおりです。retrieveYeets()がSwipeRefreshLayoutリフレッシュに呼ばれています。だから私がリフレッシュするたびに、私は再びすべてのデータをすべて取得しています。

私が何を意味するかを見るために、更新時にTwitterのUIを見てください。私はまだフェッチされていない新しいデータを取得し、それをアダプタの上部に追加したいだけです。それ以外の場合は、不要なクエリを実行しています。プロファイルの画像、ユーザー名、フルネームはすべての更新時に新しいクエリで再ダウンロードされるため、フィード全体に点滅します。

目的:最後に作成されたオブジェクトの日付

  • 追加した後のオブジェクトの

    • クエリ既存のアダプタに新しいデータのみ

    更新:

    private void refreshYeets(Date date, FeedAdapter adapter) { 
         String groupId = ParseUser.getCurrentUser().getString("groupId"); 
         ParseQuery<ParseObject> query = new ParseQuery<>(ParseConstants.CLASS_YEET); 
         query.whereContains(ParseConstants.KEY_GROUP_ID, groupId); 
         query.orderByDescending("lastReplyUpdatedAt"); 
         if (date != null) 
          query.whereLessThanOrEqualTo("createdAt", date); 
         query.setLimit(1000); 
         query.findInBackground((yeets, e) -> { 
    
          if (mSwipeRefreshLayout.isRefreshing()) { 
           mSwipeRefreshLayout.setRefreshing(false); 
          } 
    
          if (e == null) { 
           // We found messages! 
           mYeets.addAll(0, yeets); //This should append new messages to the top 
           /*System.out.println(yeets);*/ 
           if (mRecyclerView.getAdapter() == null) { 
            adapter.setHasStableIds(true); 
            mRecyclerView.setHasFixedSize(true); 
            adapter.notifyDataSetChanged(); 
            mRecyclerView.setAdapter(adapter); 
           } else { 
            adapter.notifyDataSetChanged(); 
           } 
    
          } 
         }); 
        } 
    

    これは動作しますが、アダプタリストオブジェクトの多くが置き換えられ、間違った位置にあります。ここでどのような訂正をする必要がありますか?どういうわけか新しいオブジェクトの数でリストから相殺する必要がありますか?ここで

  • +0

    で作成されたと呼ばれる、すべての解析行に関連付けられたフィールドがあります。私はあなたがすでに前のデータを持っているので、その日付の前に作成された行を比較して取り出すクエリを作成することができると思います。それが役に立ったら教えてください。 –

    +0

    これをチェックしてください:https://www.parse.com/questions/android-api-query-to-get-all-objects-created-today –

    +0

    いいえ、新しいデータを既存のアダプタに追加しますか? – santafebound

    答えて

    -1

    は、あなたがそれを行うことができます方法です。

    private void retrieveYeets(Date date) { 
         String groupId = ParseUser.getCurrentUser().getString("groupId"); 
         ParseQuery<ParseObject> query = new ParseQuery<>(ParseConstants.CLASS_YEET); 
         query.whereContains(ParseConstants.KEY_GROUP_ID, groupId); 
         query.orderByDescending("lastReplyUpdatedAt"); 
         if(date != null) 
         query. whereGreaterThan("createdAt", date); 
         query.setLimit(1000); 
         query.findInBackground((yeets, e) -> { 
    
          if (mSwipeRefreshLayout.isRefreshing()) { 
           mSwipeRefreshLayout.setRefreshing(false); 
          } 
    
          if (e == null) { 
    
           // We found messages! 
           mYeets.addAll(0, yeets); //This should append new messages to the top 
           /*System.out.println(yeets);*/ 
           if(mRecyclerView.getAdapter() == null) { 
           mAdapter = new FeedAdapter(getContext(), mYeets); 
           mAdapter.setHasStableIds(true); 
           mRecyclerView.setHasFixedSize(true); 
           adapter.notifyDataSetChanged(); 
           mRecyclerView.setAdapter(adapter); 
           } 
           else { 
           mAdapter.notifyDataSetChanged(); 
           } 
    
          } 
         }); 
        } 
    
    +0

    dateパラメータはonCreateで作成し、後でアクセスするためのグローバル設定として保存する必要がありますか?あなたは、ユーザーが最初にリストオブジェクトを見る瞬間からの日付を望むでしょうから。 – santafebound

    +0

    私は、日付の値が動的に更新され(各クエリの最後に返されなければならない)、そうでなければ同じオブジェクトの多くの倍数を取得する必要があるように感じます。 – santafebound

    +0

    否定的な投票を説明してください。はい、データを取得する必要がある日付を追跡する必要があります。これは、日付なしでパースするクエリを初めて利用するときに利用できます。それがヌルチェックの重要性です。 –

    関連する問題