Use RecyclerView dentro de ScrollView con altura de elemento Recycler flexible

Quiero saber si hay alguna forma de usar RecyclerView .

antes de esto, utilizo RecyclerView con una altura de corrección dentro de una ScrollView, pero esta vez no sé la altura del artículo.

Sugerencia : leo todas las preguntas y soluciones de la pregunta de stack antes de hacer esta pregunta desde hace 4 días.

actualización: alguna solución aprenda a desplazarse por RecyclerView por su cuenta, pero quiero mostrar esto ampliado.

Si solo desea desplazarse, puede usar NestedScrollView en lugar de ScrollView para poder modificar su código con lo siguiente:

  //design your content here with RecyclerView   

Busco responder esta pregunta en todo el mundo, pero no encontré ninguna respuesta directa para esta popular pregunta. ¡Finalmente mezclé un truco y resolví este problema!

Mi problema comenzó cuando mi jefe me pidió que usara un RecyclerView dentro de ScrollView , y como saben, no podemos usar dos objetos desplazables uno dentro del otro, excepto cuando establecemos o conocemos la altura del elemento de reparación para nuestro RecyclerView . y esta es la respuesta:

Paso 1: al principio debe encontrar su altura de artículo flexible RecyclerView y esto es posible desde su RecyclerView> onBindViewHolder

 holder.itemView.post(new Runnable() { @Override public void run() { int cellWidth = holder.itemView.getWidth();// this will give you cell width dynamically int cellHeight = holder.itemView.getHeight();// this will give you cell height dynamically dynamicHeight.HeightChange(position, cellHeight); //call your iterface hear } }); 

con este código puede encontrar la altura de su artículo mientras construye y enviar la altura del elemento a su actividad con la interfaz .

para aquellos amigos que tienen problemas con la interfaz, les dejo el código de la interfaz a continuación que debe escribir en Adapter.

 public interface DynamicHeight { void HeightChange (int position, int height); } 

Paso 2: encontramos la altura de nuestro artículo hasta el momento y ahora queremos establecer la altura de nuestro RecyclerView. primero debemos calcular la sum de la altura del artículo. en este paso hacemos esto mediante BitMap implementa primero la interfaz del último paso y escribe el siguiente código dentro de tu Actividad o Fragmento que define tu RecyclerView :

 @Override public void HeightChange(int position, int height) { itemHeight.put(position, height); sumHeight = SumHashItem (itemHeight); float density = activity.getResources().getDisplayMetrics().density; float viewHeight = sumHeight * density; review_recyclerView.getLayoutParams().height = (int) sumHeight; int i = review_recyclerView.getLayoutParams().height; } int SumHashItem (HashMap hashMap) { int sum = 0; for(Map.Entry myItem: hashMap.entrySet()) { sum += myItem.getValue(); } return sum; } 

Paso 3: ahora tenemos la sum de tu altura de RecyclerView. para el último paso deberíamos enviar la interfaz que escribimos en el último paso al adaptador con un código como este:

 reviewRecyclerAdapter = new ReviewRecyclerAdapter(activity, reviewList, review_recyclerView, this); 

cuando implemente la interfaz, debe enviársela a su contexto para que la use.

Disfrútala

[RESUELTO] Tengo el mismo problema con Horizontal recycleview. Cambie el repo de Gradle por recycleview

  compile 'com.android.support:recyclerview-v7:23.2.1' 

Escribe esto: linearLayoutManager.setAutoMeasureEnabled(true);

Se corrigieron errores relacionados con varios métodos de medida y especificación en la actualización

Consulte http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview

He encontrado un problema con la biblioteca 23.2.1: cuando el elemento es match_parent reciclar ver llenar el elemento completo para ver, siempre vaya con min height or "wrap_content".

Gracias

Use esta línea para su vista del reciclador:

 android:nestedScrollingEnabled="false" 

pruébalo, recyclerview se desplazará suavemente con altura flexible

Para arreglar fling en RecyclerView debes anular canScrollVertically en LinearLayoutManager :

 linearLayoutManager = new LinearLayoutManager(context) { @Override public boolean canScrollVertically() { return false; } }; 

En el caso de que configurar la altura fija para RecyclerView no funcionó para alguien (como yo), esto es lo que agregué a la solución de altura fija:

  mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: rv.getParent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); 

yo

Estoy totalmente de acuerdo con la solución de Ashkan, muchas gracias (¡votado +1!), Pero hay una cosa …

Si RecyclerView se desplaza correctamente dentro de ScrollView / NestedScrollView PERO no fling (lo intercepta), entonces la solución es extender RecyclerView y reemplazar OnInterceptTouchEvent y OnTouchEvent. Si no necesita acciones de clic pero solo desea presentar elementos con fling de trabajo, simplemente devuelva falso en ambos como a continuación:

 public class InterceptingRecyclerView extends RecyclerView { public InterceptingRecyclerView(Context context) { super(context); } public InterceptingRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public InterceptingRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Override public boolean onTouchEvent(MotionEvent e) { return false; } } 

O en realidad debería llamarse NonIntercepting …;) Simple como eso.

NestedScrollView este problema usando NestedScrollView lugar de ScrollView . Y para RecyclerView

   

Y en el código

 recyclerView.setHasFixedSize(true); recyclerView.setNestedScrollingEnabled(false);