1

Итак, я пытаюсь изменить высоту ImageView в методе моего ресайклера onBindViewHolder в зависимости от высоты другого объекта в том же держателе. Когда я получаю доступ к высоте с getHeight(), я возвращаюсь 0 в результате для первых нескольких элементов - скорее всего, потому, что они не нарисованы прямо сейчас.Доступ к правильной высоте объекта в ресайклере

general solution Эта проблема не работает для меня, поскольку просмотр recycler создает и связывает множество просмотров, добавляя GlobalLayoutListener к каждому из них, что, кажется, испортит эту вещь, давая мне неправильные результаты (например, просто меняя высота первого элемента).

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

    final ViewHolderDouble doubleHolder = (ViewHolderDouble) holder; 

    if (secProduct != null) { 
     final ViewTreeObserver observer = doubleHolder.linearLayoutSD.getViewTreeObserver(); 
     observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 

       int difference = doubleHolder.firstCardView.getHeight() - doubleHolder.secCardView.getHeight(); 

       if (difference > 0) { 
        ImageView rightImage = doubleHolder.imageViewR; 
        rightImage.getLayoutParams().height = rightImage.getHeight() + difference; 
        rightImage.requestLayout(); 
       } else if (difference < 0) { 
        ImageView leftImage = doubleHolder.imageViewL; 
        leftImage.getLayoutParams().height = leftImage.getHeight() + (difference * -1); 
        leftImage.requestLayout(); 
       } 

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
        doubleHolder.linearLayoutSD.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
        doubleHolder.linearLayoutSD.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
      } 
     }); 
    } 
} 

Есть ли способ, что я могу получить доступ к высоте doubleHolder.firstCardView & doubleHolder.secCardView после мнения нарисованы, так что я получаю правильную высоту и не 0?

ответ

0

У меня была довольно схожая задача некоторое время назад, так вот как я это сделал.

Во-первых, адаптер. Я не делал много onBindViewHolder, я просто запустить метод «displayItem» с содержанием - заполнить фактический View

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 
    if (position >= contentItems.size()) { 
     return; 
    } 

    ((ContentItemCardView)viewHolder.itemView).displayItem(contentItems.get(position)); 
} 

Ключевая часть происходит в ContentItemCardView каком extends CardView в моем случае. Вот короткая версия этого:

public class ContentItemCardView extends CardView { 

    @InjectView(R.id.previewImageView) 
    ImageView previewImageView; 

    @InjectView(R.id.titleTextView) 
    TextView titleTextView; 

    public ContentItemCardView(Context context){ 
     super(context); 
     ButterKnife.inject(this); 
    } 

    ..... 

    public void displayItem(ContentItem contentItem) { 
     .... 
     titleTextView.setText(contentItem.Title); 
     displayPreview(contentItem); 
     .... 
    } 

    public void displayPreview(ContentItem contentItem) { 
     int requiredHeight = determineHeight(.....); 
     previewImageView.getLayoutParams().height = requiredHeight; 
     previewImageView.requestLayout(); 
     .... 
    } 

    public int determineHeight() { 
     .... 
    } 
} 

Так что все мы оставили, чтобы иметь надлежащий determineHeight() (скажем, это должно быть в два раза выше, чем заполнены titleTextView):

public int determineHeight() { 
    final Resources resources = getResources(); 
    int screenWidth = resources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? 
      resources.getDisplayMetrics().widthPixels : 
      resources.getDisplayMetrics().heightPixels; 

    int widthMeasureSpec = MeasureSpec.makeMeasureSpec(screenWidth, MeasureSpec.AT_MOST); 
    int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 

    titleTextView.measure(widthMeasureSpec, heightMeasureSpec); 

    return titleTextView.getMeasuredHeight() * 2; 
}    

Так все, что вам нужно, это задайте явно рассчитанную высоту и requestLayout().

 int requiredHeight = determineHeight(.....); 
     previewImageView.getLayoutParams().height = requiredHeight; 
     previewImageView.requestLayout(); 

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^