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