2017-12-31 125 views
0

zu bekommen Ich habe zur Zeit einige Probleme getItem im RecyclerAdapter auf meiner Foto-Klasse. Ich habe versucht,Problem, getItem auf einem Objekt in einem RecyclerAdapter

public int getItem(int pos){ 
    return getItem(pos); 
} 

hinzuzufügen, aber das schien nicht zu funktionieren. Wie kann ich getItem(position) ohne Fehler haben? (Wenn ich nicht genug ausgearbeitet habe, bitte sagen.)

Hier ist mein Code, so können Sie mir sagen, was ich falsch mache.

ViewProfilePostsAdapter.java

public class ViewProfilePostsAdapter extends RecyclerView.Adapter<ViewProfilePostsAdapter.ViewHolder> { 
private static final String TAG = "CustomAdapter"; 

private String[] mDataSet; 
private int[] getItemIn; 

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

private Photo mPic; 



public static class ViewHolder extends RecyclerView.ViewHolder { 
    //private final TextView textView; 

    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; 

    public ViewHolder(View convertView) { 
     super(convertView); 

     if(convertView == null) { 
      username = (TextView) convertView.findViewById(R.id.display_name); 
      postImage = (ImageView) convertView.findViewById(R.id.post_image); 
      caption = (TextView) convertView.findViewById(R.id.image_caption); 
      timeDelta = (TextView) convertView.findViewById(R.id.image_time_posted); 
      likes = (TextView) convertView.findViewById(R.id.tvLikesString); 
      mProfileImage = (ImageView) convertView.findViewById(R.id.f_profile_image); 
      heartRed = (ImageView) convertView.findViewById(R.id.image_heart_red); 
      heartWhite = (ImageView) convertView.findViewById(R.id.image_heart_white); 
      heart = new Heart(heartWhite, heartRed); 
      liked = (TextView) convertView.findViewById(R.id.likeText); 
     } 
    } 

} 

public ViewProfilePostsAdapter(String[] dataSet, int[] intSet) { 
    mDataSet = dataSet; 
    getItemIn = intSet; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.layout_post_listitem, viewGroup, false); 

    return new ViewHolder(v); 
} 

@Override 
public void onBindViewHolder(final ViewHolder viewHolder, final int position) 
{ 
    Log.d(TAG, "Element " + position + " set."); 

    viewHolder.photo = getItem(position); 
    viewHolder.detector = new GestureDetector(mContext, new GestureListener(viewHolder)); 

    getCurrentUsername(); 

    getLikesString(viewHolder); 

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

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

    final ImageLoader imageLoader = ImageLoader.getInstance(); 
    imageLoader.displayImage(getItem(position).getImage_path(), viewHolder.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()); 

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

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 
@Override 
public int getItemCount() { 
    return mDataSet.length; 
} 

public int getItem(int pos){ 
    return getItem(pos); 
} 



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(); 
        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 + ",")){ 
           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; 
} 
} 

Photo.java

public class Photo implements Parcelable { 

private String caption; 
private String date_created; 
private String photo_id; 
private String user_id; 
private String tags; 
private String image_path; 
private List<Like> likes; 


public Photo(){ 

} 

public Photo(String caption, String date_created, String photo_id, String user_id, String tags, String image_path, List<Like> likes) { 
    this.caption = caption; 
    this.date_created = date_created; 
    this.photo_id = photo_id; 
    this.user_id = user_id; 
    this.tags = tags; 
    this.image_path = image_path; 
    this.likes = likes; 
} 

protected Photo(Parcel in) { 
    caption = in.readString(); 
    date_created = in.readString(); 
    photo_id = in.readString(); 
    user_id = in.readString(); 
    tags = in.readString(); 
    image_path = in.readString(); 
} 

public static final Creator<Photo> CREATOR = new Creator<Photo>() { 
    @Override 
    public Photo createFromParcel(Parcel in) { 
     return new Photo(in); 
    } 

    @Override 
    public Photo[] newArray(int size) { 
     return new Photo[size]; 
    } 
}; 

public String getCaption() { 
    return caption; 
} 

public void setCaption(String caption) { 
    this.caption = caption; 
} 

public String getDate_created() { 
    return date_created; 
} 

public void setDate_created(String date_created) { 
    this.date_created = date_created; 
} 

public String getPhoto_id() { 
    return photo_id; 
} 

public void setPhoto_id(String photo_id) { 
    this.photo_id = photo_id; 
} 

public String getUser_id() { 
    return user_id; 
} 

public void setUser_id(String user_id) { 
    this.user_id = user_id; 
} 

public String getTags() { 
    return tags; 
} 

public void setTags(String tags) { 
    this.tags = tags; 
} 

public String getImage_path() { 
    return image_path; 
} 

public void setImage_path(String image_path) { 
    this.image_path = image_path; 
} 

public List<Like> getLikes() { 
    return likes; 
} 

public void setLikes(List<Like> likes) { 
    this.likes = likes; 
} 

@Override 
public String toString() { 
    return "Photo{" + 
      "caption='" + caption + '\'' + 
      ", date_created='" + date_created + '\'' + 
      ", photo_id='" + photo_id + '\'' + 
      ", user_id='" + user_id + '\'' + 
      ", tags='" + tags + '\'' + 
      ", image_path='" + image_path + '\'' + 
      ", likes=" + likes + 
      '}'; 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel parcel, int i) { 
    parcel.writeString(caption); 
    parcel.writeString(date_created); 
    parcel.writeString(photo_id); 
    parcel.writeString(user_id); 
    parcel.writeString(tags); 
    parcel.writeString(image_path); 
} 
} 
+0

Was macht diese Funktion? Ruft es sich public int auf getItem (int pos) { return getItem (pos); } Funktion sollte auch object anstelle von int zurückgeben. – lib4

+0

Also von dem, was ich verstehe, dass Sie sagen, ist das Ändern der 'int' nach public in' public int getItem (int pos) { Rückgabe getItem (pos); } 'zu' Object', so dass es ein Objekt zurückgibt. Wenn das der Fall ist, funktioniert es nicht: P –

+0

Kannst du verstehen, was diese Funktion macht ?? public int getItem (int pos) {return getItem (pos); } – lib4

Antwort

0

Sie funktionieren Anrufe selbst:

public int getItem(int pos){ 
    return getItem(pos); 
} 

das Problem zu beheben Sie mehrere Dinge tun sollten: 1) Ihr Adapter sollte eine Sammlung von Photo-Objekten haben. Z.B. ArrayList-Liste;

Es sollte von vielleicht Countructor gefüllt werden. Daher sollte Ihr Adapter einen Konstruktor haben, der diese Liste enthält.

2) Veränderung getItem Methode dazu:

public Photo getItem(int pos){ 
    return list.get(pos); 
} 
+0

Danke dafür. –

+0

Gern geschehen –

0

Zunächst einmal sollten Sie Ihre getItem Funktion ein Objekt zurückgeben (i guess). Auch ehrlich bin ich ein wenig verwirrt, was Sie versuchen zu erreichen und ich dachte, Sie wollten einen Artikel in einer bestimmten Position in Ihrem Recycler sehen, richtig?

In Ihrer Viewholder Klasse knapp unter Code hinzufügen

int position = 0; 

In Ihrer OnBindViewHolder Funktion im RecyclerViewAdapter, gibt es eine Position jedes Element in Ihrem recyclerview

public void onBindViewHolder(RecyclerViewAdapter.MyViewHolder holder, int position) { 

    Model yourModel= modelList.get(position); 


    holder.position = position; 



} 

Außerdem, wenn Sie versuchen, OnClickListener in Ihre Recyclerview zu bekommen. Der folgende Weg könnte nützlich sein.Erstellen Schnittstelle

public interface RecyclerViewOnItemClickListener { 

void OnItemClickListener(View view, int position); 
void OnItemLongClickListener(View view, int position); 

}

Dieser Code geht in RecyclerAdapter Klasse

public void setOnItemClickListener(RecyclerViewOnItemClickListener OnItemClickListener){ 
    this.recyclerViewOnItemClickListener = OnItemClickListener; 
} 

letzte Schritt in Ihrer Haupttätigkeit oder Ihre Fragment, das Sie wollen die recyclerview zeigen

recyclerViewAdapter.setOnItemClickListener(new RecyclerViewOnItemClickListener() { 
     @Override 
     public void OnItemClickListener(View view, int position) { 
      Model yourModel= modelList.get(position); 

     } 

     @Override 
     public void OnItemLongClickListener(View view, int position) { 

     } 
    }); 

Hier ist, wie Sie das Element in einer bestimmten Position erhalten können. Hoffe das hilft;)

Verwandte Themen