1
私はチャットアプリケーションを作っています。 私はLinearLayoutManagerを拡張するLayout Managerを持っていて、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);
}
}
これはすべてのために一定の速度を持つことになり、それが一番下にあるので、新しく追加されたビューが最初に表示されていないと、それはだから、私は今、その位置までスクロールする必要があります。このような
https://github.com/nshmura/SnappySmoothScroller
表示されていない場合、それはonBindViewにはないので、私の質問は、新たに追加されたビューの高さを表示できないかどうかです。 – Ezio
新しく追加されたビューの高さは、View#onMeasureメソッドで決定されます。 View#onMeasureメソッドは、RecyclerView.Adapter#onBindViewメソッド呼び出しの後に呼び出されます。 RecyclerView.Adapter#onBindViewメソッド呼び出しの前に、ビューの高さを測定する方法がないと思います。 – nshmura