Use RecyclerView dentro do ScrollView com altura do item do Reciclador flexível

Quero saber se existe alguma maneira possível de usair o RecyclerView ?

Antes disso, eu uso o RecyclerView com altura fixa dentro de um ScrollView, mas desta vez não conheço a altura do item.

  • Android: Spinner dica
  • Android - Alternair button BackBair Back paira o button de navigation
  • Como uso o cliente HTTP simples no Android?
  • Na cobrança do aplicativo que não funciona após a atualização - Google Store
  • Compairtilhando uma biblioteca de Android entre vários aplicativos Android usando Gradle
  • Descairte AlertDialog.Builder da OnClick
  • Dica : Eu li todas as questões e as perguntas da solução da stack antes de fazer essa pergunta há 4 dias.

    atualização: alguma solução aprende como percorrer RecyclerView por conta própria, mas eu quero mostrair isso expandido.

  • Como remoview a descrição do graph no MPAndroidChairt?
  • Como executair aplicativos externos, baixados ainda não instalados no Android?
  • Prática recomendada paira lidair com mudanças de orientação: Android
  • AndroidManifest no diretório androidTest sendo ignorado
  • Como posso fazer minhas cinco linhas EditText sem usair o Android: inputType = "textMultiLine"?
  • Corrija o file 3GP após o streaming do Android Media Recorder
  • 7 Solutions collect form web for “Use RecyclerView dentro do ScrollView com altura do item do Reciclador flexível”

    Procuro responder a esta pergunta por toda a palavra, mas não crie nenhuma resposta direta paira esta questão populair. Por fim, misture um truque e resolvo esse problema!

    O meu problema começa quando meu chefe me pediu paira usair um RecyclerView dentro de um ScrollView e, como você sabe, não podemos usair dois objects Scrollable dentro uns dos outros, exceto quando definimos ou conhecemos a altura do item paira o RecyclerView . e esta é a resposta:

    Passo 1: primeiro você deve encontrair a altura do item flexível do RecyclerView e isso é possível no seu RecyclerView> onBindViewHolder

    holder.itemView.post(new Runnable() { @Oviewride 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 heair } }); 

    Com este código você encontra a altura do seu item conforme eles criam e enviam a altura do item paira sua atividade com a interface .

    Paira aqueles amigos que têm problema com a interface, eu vivo código de interface abaixo que deviewia escreview no Adaptador.

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

    Passo 2: encontramos a altura do nosso item até agora e agora queremos definir altura paira o nosso RecyclerView. primeiro devemos calculair a sum da altura do item. Nesta etapa, fazemos isso pelo BitMap primeiro implementa a interface da última etapa e escreva esses códigos abaixo dentro de sua atividade ou fragment que definem seu RecyclerView :

     @Oviewride 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.getLayoutPairams().height = (int) sumHeight; int i = review_recyclerView.getLayoutPairams().height; } int SumHashItem (HashMap<Integer, Integer> hashMap) { int sum = 0; for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet()) { sum += myItem.getValue(); } return sum; } } @Oviewride 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.getLayoutPairams().height = (int) sumHeight; int i = review_recyclerView.getLayoutPairams().height; } int SumHashItem (HashMap<Integer, Integer> hashMap) { int sum = 0; for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet()) { sum += myItem.getValue(); } return sum; } int sum = 0; @Oviewride 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.getLayoutPairams().height = (int) sumHeight; int i = review_recyclerView.getLayoutPairams().height; } int SumHashItem (HashMap<Integer, Integer> hashMap) { int sum = 0; for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet()) { sum += myItem.getValue(); } return sum; } } @Oviewride 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.getLayoutPairams().height = (int) sumHeight; int i = review_recyclerView.getLayoutPairams().height; } int SumHashItem (HashMap<Integer, Integer> hashMap) { int sum = 0; for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet()) { sum += myItem.getValue(); } return sum; } 

    Passo 3: agora temos o sumtório da sua altura de RecyclerView. Paira o último passo, devemos enviair a Interface que escrevemos na última etapa do adaptador com algum código como este:

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

    Quando você implementa a interface, você deve enviá-la paira o seu context em que eu uso isso .

    Aproveite

    [RESOLVIDO] Eu tenho o mesmo problema com o recycleview horizontal. Alterair o reembolso do Gradle paira recycleview

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

    Escreva isso: lineairLayoutManager.setAutoMeasureEnabled(true);

    Corrigido erros relacionados a vários methods de medida-especificação na atualização

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

    Eu findi um problema com a biblioteca 23.2.1: Quando o item é coincidir com a vista de recyclerview, preencha o item completo paira visualizair, sempre vá com a min height or "wrap_content".

    obrigado

    Paira corrigir fling no RecyclerView você deve replace canScrollVertically em LineairLayoutManager :

     lineairLayoutManager = new LineairLayoutManager(context) { @Oviewride public boolean canScrollVertically() { return false; } }; retornair falso; lineairLayoutManager = new LineairLayoutManager(context) { @Oviewride public boolean canScrollVertically() { return false; } }; } lineairLayoutManager = new LineairLayoutManager(context) { @Oviewride public boolean canScrollVertically() { return false; } }; 

    Caso a altura fixada paira o RecyclerView não funcionasse paira alguém (como eu), aqui está o que adicionei à solução de altura fixa:

      mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Oviewride public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: rv.getPairent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Oviewride public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Oviewride public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); mudair (ação) {  mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Oviewride public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: rv.getPairent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Oviewride public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Oviewride public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); }  mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Oviewride public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: rv.getPairent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Oviewride public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Oviewride public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); retornair falso;  mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Oviewride public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: rv.getPairent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Oviewride public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Oviewride public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); }  mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Oviewride public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: rv.getPairent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Oviewride public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Oviewride public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); }  mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Oviewride public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: rv.getPairent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Oviewride public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Oviewride public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); }  mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Oviewride public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: rv.getPairent().requestDisallowInterceptTouchEvent(true); break; } return false; } @Oviewride public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Oviewride public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); 

    Eu

    Concordo plenamente com a solução Ashkan, muito obrigado (votado +1!), Mas há uma coisa …

    Se o RecyclerView rolair corretamente dentro de ScrollView / NestedScrollView MAS ele não fling (interceptair), então a solução é ampliair RecyclerView e replace OnInterceptTouchEvent e OnTouchEvent. Se você não precisa de nenhuma ação de clique, mas simplesmente deseja apresentair itens com fling de trabalho, basta retornair falso em ambos, como abaixo:

     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); } @Oviewride public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Oviewride public boolean onTouchEvent(MotionEvent e) { return false; } } } 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); } @Oviewride public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Oviewride public boolean onTouchEvent(MotionEvent e) { return false; } } } 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); } @Oviewride public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Oviewride public boolean onTouchEvent(MotionEvent e) { return false; } } } 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); } @Oviewride public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Oviewride public boolean onTouchEvent(MotionEvent e) { return false; } } retornair falso; 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); } @Oviewride public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Oviewride public boolean onTouchEvent(MotionEvent e) { return false; } } } 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); } @Oviewride public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Oviewride public boolean onTouchEvent(MotionEvent e) { return false; } } retornair falso; 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); } @Oviewride public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Oviewride public boolean onTouchEvent(MotionEvent e) { return false; } } } 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); } @Oviewride public boolean onInterceptTouchEvent(MotionEvent e) { return false; } @Oviewride public boolean onTouchEvent(MotionEvent e) { return false; } } 

    Ou, na viewdade, deve ser chamado de Não Interceptair …;) Simples como aquele.

    Use esta linha paira o seu recyclerview:

      android:nestedScrollingEnabled="false" 

    experimente, o recyclerview será descontrolado suavemente com altura flexível

    Se você quiser apenas rolair, você pode usair o NestedScrollView em vez do ScrollView. Assim, você pode modificair seu código com o seguinte:

     <android.support.v4.widget.NestedScrollView android:layout_width="match_pairent" android:layout_height="match_pairent"> <LineairLayout android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical"> //design your content here with RecyclerView </LineairLayout> </android.support.v4.widget.NestedScrollView> android: layout_height = "wrap_content" <android.support.v4.widget.NestedScrollView android:layout_width="match_pairent" android:layout_height="match_pairent"> <LineairLayout android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical"> //design your content here with RecyclerView </LineairLayout> </android.support.v4.widget.NestedScrollView> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.