2017-12-14 17 views
0

私はどのようにRecyclerViewAdapterからListViewAdapterからポート私のスクリプト(MainfeedAdapter.classを)に知っていただきたいと思い、私はそれをいくつかのショットを与えたが、私はポートことはできません。RecyclerViewアダプタにListViewコントロールアダプタを移植

動作させるには何が必要ですか?前もって感謝します。

私は自分の問題をうまく説明してくれることを願っています。

MainfeedListAdapter.class

public class MainfeedListAdapter extends ArrayAdapter<Photo> { 
private static final String TAG = "MainfeedListAdapter"; 

private LayoutInflater mInflater; 
private int mLayoutResource; 
private Context mContext; 
private DatabaseReference mReference; 
private String currentUsername; 

public MainfeedListAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<Photo> objects) { 
    super(context, resource, objects); 
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mLayoutResource = resource; 
    this.mContext = context; 
    mReference = FirebaseDatabase.getInstance().getReference(); 

} 

static class Viewholder{ 
    ImageView mProfileImage; 
    String likesString; 
    TextView username, timeDelta, caption, likes, liked; 
    ImageView postImage; 
    ImageView heartRed, heartWhite; 

    UserAccountSettings settings = new UserAccountSettings(); 
    User user = new User(); 
    StringBuilder users; 
    String mLikesString; 
    boolean likeByCurrentUser; 
    Heart heart; 
    GestureDetector detector; 
    Photo photo; 
} 

@NonNull 
@Override 
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

    final Viewholder holder; 

    if(convertView == null){ 
     convertView = mInflater.inflate(mLayoutResource, parent, false); 
     holder = new Viewholder(); 

     holder.username = (TextView) convertView.findViewById(R.id.display_name); 
     holder.postImage = (ImageView) convertView.findViewById(R.id.post_image); 
     holder.caption = (TextView) convertView.findViewById(R.id.image_caption); 
     holder.timeDelta = (TextView) convertView.findViewById(R.id.image_time_posted); 
     holder.likes = (TextView) convertView.findViewById(R.id.tvLikesString); 
     holder.mProfileImage = (ImageView) convertView.findViewById(R.id.f_profile_image); 
     holder.heartRed = (ImageView) convertView.findViewById(R.id.image_heart_red); 
     holder.heartWhite = (ImageView) convertView.findViewById(R.id.image_heart_white); 
     holder.heart = new Heart(holder.heartWhite, holder.heartRed); 
     holder.liked = (TextView) convertView.findViewById(R.id.likeText); 
     holder.photo = getItem(position); 
     holder.detector = new GestureDetector(mContext, new GestureListener(holder)); 

     convertView.setTag(holder); 

    }else{ 
     holder = (Viewholder) convertView.getTag(); 
    } 

    getCurrentUsername(); 

    getLikesString(holder); 

    holder.caption.setText(getItem(position).getCaption()); 

    String timestampDifference = getTimestampDifference(getItem(position)); 
    if(!timestampDifference.equals("0")){ 
     holder.timeDelta.setText(timestampDifference + " DAYS AGO"); 
    }else{ 
     holder.timeDelta.setText("TODAY"); 
    } 

    final ImageLoader imageLoader = ImageLoader.getInstance(); 
    imageLoader.displayImage(getItem(position).getImage_path(), holder.postImage); 


    //get the profile image and username 
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
    Query query = reference 
      .child(mContext.getString(R.string.dbname_user_account_settings)) 
      .orderByChild(mContext.getString(R.string.field_user_id)) 
      .equalTo(getItem(position).getUser_id()); 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.e(TAG, "onDataChange: OnDataChange ******************************************************************************"); 
      for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 


       Log.e(TAG, "onDataChange: found user: " 
         + singleSnapshot.getValue(UserAccountSettings.class).getUsername() + "****************************"); 

       holder.username.setText(singleSnapshot.getValue(UserAccountSettings.class).getUsername()); 


       imageLoader.displayImage(singleSnapshot.getValue(UserAccountSettings.class).getProfile_photo(), 
         holder.mProfileImage); 

       holder.settings = singleSnapshot.getValue(UserAccountSettings.class); 

      } 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    Query userQuery = mReference 
      .child(mContext.getString(R.string.dbname_users)) 
      .orderByChild(mContext.getString(R.string.field_user_id)) 
      .equalTo(getItem(position).getUser_id()); 
    userQuery.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
       Log.d(TAG, "onDataChange: found user: " + 
         singleSnapshot.getValue(User.class).getUsername()); 

       holder.user = singleSnapshot.getValue(User.class); 
      } 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 



    return convertView; 
} 

//----------------------------------------Likes--------------------------- 

public class GestureListener extends GestureDetector.SimpleOnGestureListener{ 

    Viewholder mHolder; 
    public GestureListener(Viewholder holder) { 
     mHolder = holder; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     Log.d(TAG, "onDoubleTap: double tap detected."); 

     DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
     Query query = reference 
       .child(mContext.getString(R.string.dbname_photos)) 
       .child(mHolder.photo.getPhoto_id()) 
       .child(mContext.getString(R.string.field_likes)); 
     query.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 

        String keyID = singleSnapshot.getKey(); 

        //case1: Then user already liked the photo 
        if(mHolder.likeByCurrentUser && 
          singleSnapshot.getValue(Like.class).getUser_id() 
            .equals(FirebaseAuth.getInstance().getCurrentUser().getUid())){ 

         mReference.child(mContext.getString(R.string.dbname_photos)) 
           .child(mHolder.photo.getPhoto_id()) 
           .child(mContext.getString(R.string.field_likes)) 
           .child(keyID) 
           .removeValue(); 
          .removeValue(); 

         mReference.child(mContext.getString(R.string.dbname_user_photos)) 
           .child(mHolder.photo.getUser_id()) 
           .child(mHolder.photo.getPhoto_id()) 
           .child(mContext.getString(R.string.field_likes)) 
           .child(keyID) 
           .removeValue(); 

         mHolder.heart.toggleLike(); 
         getLikesString(mHolder); 
        } 
        //case2: The user has not liked the photo 
        else if(!mHolder.likeByCurrentUser){ 
         //add new like 
         addNewLike(mHolder); 
         break; 
        } 
       } 
       if(!dataSnapshot.exists()){ 
        //add new like 
        addNewLike(mHolder); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     return true; 
    } 
} 

private void addNewLike(final Viewholder holder){ 
    Log.d(TAG, "addNewLike: adding new like"); 

    String newLikeID = mReference.push().getKey(); 
    Like like = new Like(); 
    like.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid()); 

    mReference.child(mContext.getString(R.string.dbname_photos)) 
      .child(holder.photo.getPhoto_id()) 
      .child(mContext.getString(R.string.field_likes)) 
      .child(newLikeID) 
      .setValue(like); 

    mReference.child(mContext.getString(R.string.dbname_user_photos)) 
      .child(holder.photo.getUser_id()) 
      .child(holder.photo.getPhoto_id()) 
      .child(mContext.getString(R.string.field_likes)) 
      .child(newLikeID) 
      .setValue(like); 

    holder.heart.toggleLike(); 
    getLikesString(holder); 
} 

private void getCurrentUsername(){ 
    Log.d(TAG, "getCurrentUsername: retrieving user account settings"); 
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
    Query query = reference 
      .child(mContext.getString(R.string.dbname_users)) 
      .orderByChild(mContext.getString(R.string.field_user_id)) 
      .equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid()); 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
       currentUsername = singleSnapshot.getValue(UserAccountSettings.class).getUsername(); 
      } 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

private void getLikesString(final Viewholder holder){ 
    Log.d(TAG, "getLikesString: getting likes string"); 

    try{ 
     DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
     Query query = reference 
       .child(mContext.getString(R.string.dbname_photos)) 
       .child(holder.photo.getPhoto_id()) 
       .child(mContext.getString(R.string.field_likes)); 
     query.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       holder.users = new StringBuilder(); 
       for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
        Query query = reference 
          .child(mContext.getString(R.string.dbname_users)) 
          .orderByChild(mContext.getString(R.string.field_user_id)) 
          .equalTo(singleSnapshot.getValue(Like.class).getUser_id()); 
        query.addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
           Log.d(TAG, "onDataChange: found like: " + 
             singleSnapshot.getValue(User.class).getUsername()); 

           holder.users.append(singleSnapshot.getValue(User.class).getUsername()); 
           holder.users.append(","); 
          } 

          String[] splitUsers = holder.users.toString().split(","); 

          if(holder.users.toString().contains(currentUsername + ",")){//mitch, mitchell.tabian 
           holder.likeByCurrentUser = true; 
          }else{ 
           holder.likeByCurrentUser = false; 
          } 

          int length = splitUsers.length; 
          if(length == 1){ 
           holder.likesString = "Liked by " + splitUsers[0]; 
          } 
          else if(length == 2){ 
           holder.likesString = "Liked by " + splitUsers[0] 
             + " and " + splitUsers[1]; 
          } 
          else if(length == 3){ 
           holder.likesString = "Liked by " + splitUsers[0] 
             + ", " + splitUsers[1] 
             + " and " + splitUsers[2]; 

          } 
          else if(length == 4){ 
           holder.likesString = "Liked by " + splitUsers[0] 
             + ", " + splitUsers[1] 
             + ", " + splitUsers[2] 
             + " and " + splitUsers[3]; 
          } 
          else if(length > 4){ 
           holder.likesString = "Liked by " + splitUsers[0] 
             + ", " + splitUsers[1] 
             + ", " + splitUsers[2] 
             + " and " + (splitUsers.length - 3) + " others"; 
          } 
          Log.d(TAG, "onDataChange: likes string: " + holder.likesString); 
          //setup likes string 
          setupLikesString(holder, holder.likesString); 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
       } 
       if(!dataSnapshot.exists()){ 
        holder.likesString = ""; 
        holder.likeByCurrentUser = false; 
        //setup likes string 
        setupLikesString(holder, holder.likesString); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    }catch (NullPointerException e){ 
     Log.e(TAG, "getLikesString: NullPointerException: " + e.getMessage()); 
     holder.likesString = ""; 
     holder.likeByCurrentUser = false; 
     //setup likes string 
     setupLikesString(holder, holder.likesString); 
    } 
} 

private void setupLikesString(final Viewholder holder, String likesString) { 
    Log.d(TAG, "setupLikesString: likes string:" + holder.likesString); 

    if (holder.likeByCurrentUser) { 
     Log.d(TAG, "setupLikesString: photo is liked by current user"); 
     holder.liked.setText("UnLike"); 
     holder.heartWhite.setVisibility(View.GONE); 
     holder.heartRed.setVisibility(View.VISIBLE); 
     holder.heartRed.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return holder.detector.onTouchEvent(event); 
      } 
     }); 
    } else { 
     Log.d(TAG, "setupLikesString: photo is not liked by current user"); 
     holder.liked.setText("Like"); 
     holder.heartWhite.setVisibility(View.VISIBLE); 
     holder.heartRed.setVisibility(View.GONE); 
     holder.heartWhite.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return holder.detector.onTouchEvent(event); 
      } 
     }); 
    } 
    holder.likes.setText(likesString); 

} 


    //---------------------------------------------end of likes---------------------------- 

private String getTimestampDifference(Photo photo){ 
    Log.d(TAG, "getTimestampDifference: getting timestamp difference."); 

    String difference = ""; 
    Calendar c = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.CANADA); 
    sdf.setTimeZone(TimeZone.getTimeZone("Canada/Pacific"));//google 'android list of timezones' 
    Date today = c.getTime(); 
    sdf.format(today); 
    Date timestamp; 
    final String photoTimestamp = photo.getDate_created(); 
    try{ 
     timestamp = sdf.parse(photoTimestamp); 
     difference = String.valueOf(Math.round(((today.getTime() - timestamp.getTime())/1000/60/60/24))); 
    }catch (ParseException e){ 
     Log.e(TAG, "getTimestampDifference: ParseException: " + e.getMessage()); 
     difference = "0"; 
    } 
    return difference; 
} 

}

+0

この例を確認できますか。 https://github.com/googlesamples/android-RecyclerView –

答えて

0

私はあなたの移植によって何を意味するかわからないが、あなたは、リストビューを持っているし、今より良いパフォーマンスのための代わりにリサイクルビューを使用する場合。これに続くことができますgoogle sample codeguide for recycler view。リストビューとリサイクラビューのアダプタは非常に似ているので、ほとんどのコードを再利用できます。

+0

ありがとうございます。 –

関連する問題