2016-07-11 3 views
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); 
} 

}

答えて

0

新しく追加されたビューにアクセスするあなたの目的は、一定のsmoothscroll速度を作ることであるならば、このライブラリはあなたのために有用である可能性があります。

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

これはすべてのために一定の速度を持つことになり、それが一番下にあるので、新しく追加されたビューが最初に表示されていないと、それはだから、私は今、その位置までスクロールする必要があります。このような
https://github.com/nshmura/SnappySmoothScroller

表示されていない場合、それはonBindViewにはないので、私の質問は、新たに追加されたビューの高さを表示できないかどうかです。 – Ezio

+0

新しく追加されたビューの高さは、View#onMeasureメソッドで決定されます。 View#onMeasureメソッドは、RecyclerView.Adapter#onBindViewメソッド呼び出しの後に呼び出されます。 RecyclerView.Adapter#onBindViewメソッド呼び出しの前に、ビューの高さを測定する方法がないと思います。 – nshmura

関連する問題