Я создаю контактное приложение. При создании нового контакта пользователь может включить камеру и сделать фотографию. Существует 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);
}
}