List<ParseUser>. Содержит ParseUser всегда FALSE

У меня есть заявление, если написано ниже:

//Set Friend Action OnClickListener & Image
    if (ParseUser.getCurrentUser().getList("friendsArray").contains(searchResultsList.get(position))) {
        Glide.with(holder.imgFriendAction.getContext()).load(R.drawable.ic_phone_black_24dp).into(holder.imgFriendAction);
        ImageViewCompat.setImageTintList(holder.imgFriendAction, ColorStateList.valueOf(searchContext.getColor(R.color.green)));
    }
    else if (ParseUser.getCurrentUser().getList("pendingFriendsArray").contains(searchResultsList.get(position))) {
        Glide.with(holder.imgFriendAction.getContext()).load(R.drawable.ic_check_black_24dp).into(holder.imgFriendAction);
        ImageViewCompat.setImageTintList(holder.imgFriendAction, ColorStateList.valueOf(searchContext.getColor(R.color.gray_dark)));
    }
    else {
        Glide.with(holder.imgFriendAction.getContext()).load(R.drawable.ic_person_add_black_24dp).into(holder.imgFriendAction);
        ImageViewCompat.setImageTintList(holder.imgFriendAction, ColorStateList.valueOf(searchContext.getColor(R.color.colorPrimary)));
    }

Проблема в том, что каждый раз, когда я запускаю этот оператор, он всегда возвращает FALSE для обоих операторов if, хотя я точно знаю, что friendsArray и pendingFriendsArray возвращают TRUE во многих случаях.

Оба массива содержат указатели на таблицу _User.

searchResultsList объявлен следующим образом:

private List<ParseUser> searchResultsList;

Я зарегистрировал все три элемента (friendsArray, pendingFriendsArray & searchResultsList.get(position)) в консоли, и они показывают следующее:

D/friendsArray: [com.parse.ParseUser@ae66779, com.parse.ParseUser@8371cbe, com.parse.ParseUser@32d511f, com.parse.ParseUser@5fd2c6c, com.parse.ParseUser@7dd0235, com.parse.ParseUser@9c446ca, com.parse.ParseUser@5fe03b] 

D/pendingFriendsArray: [com.parse.ParseUser@7c6a358, com.parse.ParseUser@3688cb1, com.parse.ParseUser@480596]

D/searchResultsList.get(position) =: com.parse.ParseUser@5fe03b

Весь класс ниже:

public class SearchUserAdapter extends RecyclerView.Adapter<SearchUserAdapter.ViewHolder> {
private Context searchContext;
private List<ParseUser> searchResultsList;
OnItemClickListener onItemClickListener;

public SearchUserAdapter(Context context, List<ParseUser> dataSet) {
    searchContext = context;
    searchResultsList = dataSet;
}

public interface OnItemClickListener {
    public void onItemClick(View view, ParseUser searchUserObject, int position);
}

public void setOnItemClickListener(final OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(searchContext).inflate(R.layout.ly_search_user, parent,false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {

    //Set User Name
    holder.txtUserName.setText(searchResultsList.get(position).getString("fullName"));

    //Set User Location
    holder.txtUserLocation.setText(GlobalFunctions.getParseUserLocationAsString(holder.txtUserName.getContext(), searchResultsList.get(position)));

    //Set User Profile Image
    if (searchResultsList.get(position).getParseFile("profilePicture") != null) {
        Glide.with(holder.imgUserProfilePicture.getContext()).applyDefaultRequestOptions(RequestOptions.circleCropTransform()).load(searchResultsList.get(position).getParseFile("profilePicture").getUrl()).into(holder.imgUserProfilePicture);
    }
    else {
        Glide.with(holder.imgUserProfilePicture.getContext()).applyDefaultRequestOptions(RequestOptions.circleCropTransform()).load(R.drawable.ic_profile_place_holder).into(holder.imgUserProfilePicture);
    }

    //Set Row OnClickListener
    holder.rlUserItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (searchResultsList.get(position).getObjectId().equalsIgnoreCase(ParseUser.getCurrentUser().getObjectId())) {
                Intent openProfile;
                openProfile = new Intent(holder.rlUserItem.getContext(), TimelineActivity.class);
                holder.rlUserItem.getContext().startActivity(openProfile);
            }
            else {
                Intent openOtherProfile = new Intent(holder.rlUserItem.getContext(), OtherUserTimelineActivity.class);
                openOtherProfile.putExtra("otherUserProfileId", searchResultsList.get(position).getObjectId());
                holder.rlUserItem.getContext().startActivity(openOtherProfile);
            }
        }
    });

    //Set Friend Action OnClickListener & Image
    if (ParseUser.getCurrentUser().getList("friendsArray").contains(searchResultsList.get(position))) {
        Glide.with(holder.imgFriendAction.getContext()).load(R.drawable.ic_phone_black_24dp).into(holder.imgFriendAction);
        ImageViewCompat.setImageTintList(holder.imgFriendAction, ColorStateList.valueOf(searchContext.getColor(R.color.green)));
    }
    else if (ParseUser.getCurrentUser().getList("pendingFriendsArray").contains(searchResultsList.get(position))) {
        Glide.with(holder.imgFriendAction.getContext()).load(R.drawable.ic_check_black_24dp).into(holder.imgFriendAction);
        ImageViewCompat.setImageTintList(holder.imgFriendAction, ColorStateList.valueOf(searchContext.getColor(R.color.gray_dark)));
    }
    else {
        Glide.with(holder.imgFriendAction.getContext()).load(R.drawable.ic_person_add_black_24dp).into(holder.imgFriendAction);
        ImageViewCompat.setImageTintList(holder.imgFriendAction, ColorStateList.valueOf(searchContext.getColor(R.color.colorPrimary)));
    }
    holder.imgFriendAction.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            friendActionListenerAction(holder, searchResultsList.get(position));
        }
    });
}

private void friendActionListenerAction(ViewHolder holder, ParseUser parseUser) {
    if (ParseUser.getCurrentUser().getList("friendsArray").contains(parseUser)) {
        FLKCallUtils.showCallDialog(holder.imgFriendAction.getContext());
    }
    else if (ParseUser.getCurrentUser().getList("pendingFriendsArray").contains(parseUser)) {
        //Do nothing
    }
    else {
        //Add Friend
        FLKFriendUtils.sendFriendRequestFromUserToUser(ParseUser.getCurrentUser(), parseUser);

        //Update Image
        Glide.with(holder.imgFriendAction.getContext()).load(R.drawable.ic_check_black_24dp).into(holder.imgFriendAction);
        ImageViewCompat.setImageTintList(holder.imgFriendAction, ColorStateList.valueOf(searchContext.getColor(R.color.gray_dark)));
    }
}

@Override
public int getItemCount() {
    return searchResultsList.size();
}

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public MediumRobotoTextView txtUserName;
    public RegularRobotoTextView txtUserLocation;
    public RelativeLayout rlUserItem;
    ImageView imgUserProfilePicture;
    ImageView imgFriendAction;

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

        rlUserItem = (RelativeLayout) itemView.findViewById(R.id.rl_user_container);
        rlUserItem.setOnClickListener(this);

        txtUserName = (MediumRobotoTextView) itemView.findViewById(R.id.txt_user_name);
        txtUserLocation = (RegularRobotoTextView) itemView.findViewById(R.id.txt_user_location);

        imgUserProfilePicture = (ImageView) itemView.findViewById(R.id.img_profile_picture);
        imgUserProfilePicture.setOnClickListener(this);

        imgFriendAction = (ImageView) itemView.findViewById(R.id.img_friend_action);
        imgFriendAction.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        //TODO - do something here if you wish
    }
}

1 ответ

Решение

После дальнейшего расследования я обнаружил, что SDK parse-android не получает указатели одинаково каждый раз. Например, когда я получаю "friendsArray", скажем прямо сейчас, он вернется

[com.parse.ParseUser@ae66779, com.parse.ParseUser@8371cbe, com.parse.ParseUser@32d511f, com.parse.ParseUser@5fd2c6c, com.parse.ParseUser@7dd0235, com.parse.ParseUser@9c446ca, com.parse.ParseUser@5fe03b]

Однако, если я получу его, скажем, через 5 минут, он вернется

[com.parse.ParseUser@ec99877, com.parse.ParseUser@674bcg, com.parse.ParseUser@749hhc, com.parse.ParseUser@6fh3d6dg, com.parse.ParseUser@jdj8dk, com.parse.ParseUser@4c966ca, com.parse.ParseUser@3f0eeb]

Кроме того, я заметил, что даже указатель на searchResultsList.get(position) меняет свою ссылку каждый раз, когда я его загружаю.

Я нашел способ создать функцию (см. Ниже), которая возвращает массив фактических objectId указателей внутри 'friendsArray'. Таким образом, я могу гарантировать, что он всегда будет возвращать одни и те же элементы и, следовательно, создать точное сравнение.

public static List<String> friendsArrayObjectIdsArray() {
    //Create Array of Friends
    List<ParseUser> friendsArray = ParseUser.getCurrentUser().getList("friendsArray");

    //Create Temp Array of Object Id's
    List<String> tempObjectIdsArray = new ArrayList<>();

    //Iterate List
    for (ParseUser friendUser : friendsArray) {
        tempObjectIdsArray.add(friendUser.getObjectId());
    }

    return tempObjectIdsArray;
}

Затем я запускаю следующее сравнение, чтобы получить результат, который я ищу

if (FLKUserUtils.friendsArrayObjectIdsArray().contains(searchResultsList.get(position).getObjectId())) {
//Do something
}
Другие вопросы по тегам