2016-07-11 4 views
1

Я делаю чат-приложение. У меня есть менеджер макетов, который расширяет LinearLayoutManager, и я хочу вычислить высоту представления, добавленного к адаптеру, чтобы при вызове smoothScrollToPosition() я мог изменить скорость прокрутки.Как получить доступ к недавно добавленному представлению от администратора linearlayout

Для большей высоты я сделаю MILLISECONDS_PER_INCH меньшим значением и для меньшей высоты я сделаю его большим.

Но я не могу рассчитать высоту недавно добавленного вида.

public class SmoothLinearLayoutManager extends LinearLayoutManager { 

private ChatAdapter mChatAdapter; 
private Context mContext; 
private final float MILLISECONDS_PER_INCH = 250f; 
public SmoothLinearLayoutManager(Context context,ChatAdapter adapter) { 
    super(context); 
    mContext = context; 
    mChatAdapter = adapter; 
} 

public SmoothLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { 
    super(context, orientation, reverseLayout); 
    mContext = context; 
} 

public SmoothLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    mContext = context; 
} 

@Override 
public void smoothScrollToPosition(final RecyclerView recyclerView, RecyclerView.State state, final int position) { 

    Log.d("Scroll",mChatAdapter.getChildHeight()+""); 

    LinearSmoothScroller smoothScroller = new LinearSmoothScroller(mContext) { 
     @Override 
     public PointF computeScrollVectorForPosition(int targetPosition) { 
      return SmoothLinearLayoutManager.this.computeScrollVectorForPosition(position); 
     } 

     @Override 
     protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { 
      return (MILLISECONDS_PER_INCH)/displayMetrics.densityDpi; 
     } 
    }; 
    smoothScroller.setTargetPosition(position); 
    startSmoothScroll(smoothScroller); 
} 

}

ответ

0

Если ваша цель доступа к недавно добавленным, чтобы сделать постоянную скорость smoothscroll, эта библиотека может быть полезна для вас.
https://github.com/nshmura/SnappySmoothScroller

так:

layoutManager = new SnappyLinearLayoutManager(context); 
layoutManager.setSnapDuration(500); 
layoutManager.setSeekDuration(1000); 
+0

Это будет иметь постоянную скорость для всех, недавно добавленный не видно изначально, потому что он находится в нижней части, и я должен перейти к этой позиции, теперь, так как это не видно, это не в onBindView, поэтому мой вопрос состоял в том, можно ли измерить высоту недавно добавленного представления, которое не видно? – Ezio

+0

Высота вновь добавленного вида определяется в методе View # onMeasure. View # метод onMeasure вызывается после вызова метода RecyclerView.Adapter # onBindView. Так что я думаю, что нет способа измерить высоту представления перед вызовом метода RecyclerView.Adapter # onBindView. – nshmura