2016-07-11 12 views
1

Ich mache eine Chat-Anwendung. Ich habe einen Layout-Manager, der LinearLayoutManager erweitert und ich möchte die Höhe der Ansicht, die dem Adapter hinzugefügt wird, berechnen, so dass ich beim Scrollen SmoothScrollToPosition() die Bildlaufgeschwindigkeit ändern konnte.Zugriff auf die neu hinzugefügte Ansicht von linearlayout Manager

Für mehr Höhe werde ich MILLISECONDS_PER_INCH zu einem kleineren Wert machen und für weniger Höhe werde ich es groß machen.

Aber ich bin nicht in der Lage, die Höhe der neu hinzugefügten Ansicht zu berechnen.

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); 
} 

}

Antwort

0

Wenn Ihr Zweck neu hinzugefügt Ansicht Zugriff auf konstant Smooth Geschwindigkeit zu machen, kann diese Bibliothek für Sie nützlich sein.
https://github.com/nshmura/SnappySmoothScroller

wie folgt aus:

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

Diese konstante Geschwindigkeit für alle haben wird, die neu hinzugefügte Ansicht ist zunächst nicht sichtbar, weil sie im Boden ist, und ich habe zu dieser Position zu bewegen, jetzt, da es ist nicht sichtbar, es ist nicht in der onBindView, also meine Frage war, ob wir die Höhe der neu hinzugefügten Ansicht, die nicht sichtbar ist, messen können? – Ezio

+0

Die Höhe der neu hinzugefügten Ansicht wird in View # onMeasure-Methode bestimmt. View # onMeasure-Methode wird nach RecyclerView.Adapter # onBindView-Methodenaufruf aufgerufen. Also ich denke, es gibt keine Möglichkeit, die Höhe der Ansicht vor RecyclerView.Adapter # onBindView Methodenaufruf zu messen. – nshmura