RecyclerView не использует соответствующий элемент из ViewTreeObserver? - PullRequest
0 голосов
/ 24 апреля 2020

Я создаю контактное приложение. При создании нового контакта пользователь может включить камеру и сделать фотографию. Существует ContactsActivity, который отображает все Contact с использованием RecyclerView. Внутри RecyclerView (ContactsAdapter) я пересчитываю размер снятого изображения и помещаю масштабированное изображение в ImageView, который является частью макета для RecyclerView.

В течение некоторого времени я получал ArithmeticException, поскольку getWidth() и getHeight() возвращали 0. Я получил это с помощью ViewTreeObserver.

У меня есть вспомогательный метод (PictureUtils.getScaledBitmap()), который делает изменение размера снимка. Я не показываю это здесь для ясности.

Основная проблема, с которой я сталкиваюсь, это когда я создаю два Contact s и перехожу на ContactsActivity, я вижу эти два Contact s, но у каждого Contact была сделана первая фотография!

Contact класс:

    public class Contact {

    private int id, mAvatar;
    private String mFirstname;
    private String mLastname;
    private String mEmail;
    private String mCurrentPhotoPath;
}

Это то, что есть в onBindViewHolder() в RecyclerView:

    @Override
    public void onBindViewHolder(ViewHolder holder, int position){
        //Set the values inside the given view
        CardView cardView = holder.cardView;
        currentContact = mContacts.get(position); //mContacts is collection passed to the constructor of RecyclerView

        ImageView imageView = (ImageView)cardView.findViewById(R.id.image_profile);


        ViewTreeObserver observer = imageView.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {

                if (currentContact.getCurrentPhotoPath() != null) {
                    Log.i("WIDTH",String.valueOf(imageView.getWidth())); //Here I get desired value
                    Log.i("HEIGHT",String.valueOf(imageView.getHeight())); //Here as well
                    Log.i("Photo path: ", currentContact.getCurrentPhotoPath()); //Here, I get path/IMG_0, for both images, I need to get path/IMG_0 and path/IMG_1

                    Bitmap bitmap = PictureUtils.getScaledBitmap(currentContact.getCurrentPhotoPath(), width, height);

                    imageView.setImageBitmap(bitmap);


                } else {
                    if (currentContact.getAvatar() != 0){
                        Drawable drawable = cardView.getResources().getDrawable(mContacts.get(position).getAvatar());
                        imageView.setImageDrawable(drawable);
                    }
                }

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            }
        });
}

Как отобразить для каждой Contact его фотографию?

Редактировать (для комментария ниже)

Вот ViewHolder, он содержится внутри RecyclerView:

 public static class ViewHolder extends RecyclerView.ViewHolder {

    private CardView cardView;
    private LinearLayout mLinearLayout;

    public ViewHolder(CardView v) {
        super(v);
        cardView = v;
        mLinearLayout = cardView.findViewById(R.id.linear_layout);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...