2017-12-14 2 views
0

würde ich gerne wissen, wie mein Skript-Port (MainfeedAdapter.class) von einem ListViewAdapter zu einem RecyclerViewAdapter, ich habe es ein paar Schüsse gab, aber ich kann es nicht Port.ein Listview-Adapter an einen RecyclerView Adapter Portierungs

Was muss ich tun, damit es funktioniert? Danke im Voraus.

Ich hoffe, ich habe mein Problem gut erklärt, wenn nicht, werde ich es ändern.

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

können Sie dieses Beispiel überprüfen. https://github.com/googlesamples/android-RecyclerView –

Antwort

0

Ich bin nicht sicher, was Sie durch die Portierung bedeuten, aber wenn Sie eine Listenansicht und wollen nun einen Recycler Ansicht stattdessen für eine bessere Leistung verwenden. Sie können dies google sample code und guide for recycler view folgen. Der Adapter für die Listenansicht und die Recycleransicht ist sehr ähnlich, sodass Sie den Großteil Ihres Codes wiederverwenden können.

+0

Danke dafür. –