Recyclerview dentro da rolagem de scrollview aninhada, mas não rola rapidamente como Recyclerview normal ou scrollview aninhado

96

Estou usando por RecyclerViewdentro NestedScrollViewe funciona. Mas quando eu uso RecyclerViewdentro LinearLayoutou algo assim, ele rola em várias velocidades dependendo do gesto. A rolagem escuta o gesto e, se eu deslizar para cima apenas um pouco, ela rola um pouco, enquanto se eu deslizar para cima muito rápido, ela rola muito rápido. Agora meu problema é que certamente rolar por RecyclerViewdentro, NestedScrollViewmas a rolagem rápida não funciona. No entanto, deslizo para cima rápido ou devagar, RecyclerViewou NestedScrollViewapenas rolo um pouco.

Como posso fazer com que minha NestedScrollViewou RecyclerViewdentro dessa visualização de rolagem role em várias velocidades?

Aung Si Min Htet
fonte
3
recyclerView.setNestedScrollingEnabled (false); Isso realmente funciona !!
Aung Si Min Htet
stackoverflow.com/questions/27083091/… A solução pode ser encontrada aqui.
maruti060385
Use open fun setNestedScrollingEnabled (habilitado: Boolean): Unidade Espero que ajude você
Int0TheRainb0w

Respostas:

266

experimentar

recyclerView.setNestedScrollingEnabled(false);
Yang Peiyong
fonte
14
Mas com essa configuração, recyclerview não recicla visualizações! qual a sua ideia sobre isso?
MAIO
Na verdade, estou adicionando duas ou mais visualizações do reciclador com gerenciadores de layout diferentes (como Layout Linear e Layout de Grade) dentro do meu layout, que também incluem banner e outras visualizações. Portanto, para lidar com a visualização do reciclador dessa forma, coloque tudo isso dentro da correção Visualização de rolagem aninhada para mim.
Aung Si Min Htet
24
Não sei como essa resposta obteve tantos votos positivos. Se desabilitar a rolagem aninhada, isso está anulando seu propósito. E se eu quiser usar pergaminhos aninhados e reciclador ?? Algo como CoordinatorLayout, AppBarLayout e RecyclerView ??
Jimit Patel
Obrigado @JimitPatel, esse é exatamente o meu problema no momento. Tenho uma visualização de reciclagem em uma visualização de rolagem aninhada e não consigo rolar. stackoverflow.com/questions/41259756/…
Karoly
1
@Karoly precisa personalizar pergaminhos aninhados ... Tenho isso ... Postarei isso em algumas horas ... Atualmente, estou viajando. Enfrentei esse problema no efeito de paralaxe com a visualização do reciclador após a barra de ferramentas.
Jimit Patel
53

Por padrão, setNestedScrollingEnabledfunciona apenas após API-21.

Você pode usar ViewCompat.setNestedScrollingEnabled(recyclerView, false);para desativar a rolagem aninhada para antes e depois da API-21 (Lollipop). Link para a documentação .

Espero que esta ajuda!

Hemant Kaushik
fonte
22

Eu estava trabalhando no Android 16, onde não era possível usar o método setNestedSCrollEnabled,

O que acabo fazendo para impedir que o RecyclerView manipule Scrolls.

Como em LinerLayoutManager, criei canScrollHorizontally e canScrollVertically para retornar false por padrão.

myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false){
            @Override
            public boolean canScrollHorizontally() {
                return false;
            }

            @Override
            public boolean canScrollVertically() {
                return false;
            }
        });
Zain Ali
fonte
Isso realmente funcionou para mim. Eu tinha um RecyclerView, dentro de um LinearLinear, dentro de um ScrollView.
FonzTech
9

Após várias iterações, encontrei uma solução.

  1. Se você estiver usando o RecyclerView, então:

    recyclerView.setNestedScrollingEnabled(false);
  2. Se você estiver usando LinearLayout dentro de NestedScrollingView, pegue o LinearLayout dentro de um ScrollView normal e defina sua rolagem para

    scrollView.setNestedScrollingEnabled(false);
Sarthak Gandhi
fonte
2

android: overScrollMode = "nunca

  <android.support.v4.widget.NestedScrollView
    android:id="@+id/nestedScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>
 </android.support.v4.widget.NestedScrollView>
Maryam Azhdari
fonte
1

Você pode usar ScrollView com a classe ExtendRecyclerView que substitui o método onMeasure. Isso funciona para mim!

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, expandSpec);
}
Quý Nguyễn Nam
fonte
1
recyclerView.setNestedScrollingEnabled(false);

Será útil às vezes. Mas não é aconselhável para todos os momentos, porque desativa o recurso de reciclagem de visualização na visualização do recilador.

Alternativas:

Experimente CollapsiveToolbarLayout com a visualização Recycler. colocar outras visualizações no layout collapsiveTollbar.

Rajesh.k
fonte
0

Eu também conheci esse problema. E atualize para 26.1.0consertá-lo.

linkaipeng
fonte
-1

No meu caso, coloquei todas as imagens na pasta drawable em vez da pasta drawable-xxxhdpi, por isso a interface do usuário da tela está atrasada.

Mayuresh Deshmukh
fonte
-3

Você deve envolver a visualização do reciclador em qualquer layout como LinearLayout e definir o tamanho do RecyclerView como constante, como 800 dp. Isso permitirá a rolagem suave e a visualização do reciclador ainda exibirá as visualizações do reciclador durante a rolagem.

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                                xmlns:app="http://schemas.android.com/apk/res-auto"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:orientation="vertical">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="800dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</LinearLayout>

Thror
fonte
1
Esta é uma boa resposta porque aponta o caminho para consertar o problema de rolagem do fling sem quebrar o benefício principal do RecyclerView, carregando apenas as visualizações visíveis e reciclando-as quando elas são roladas para fora de vista. As pessoas podem ter votado contra ele porque um valor fixo como 800 dp não funcionará em todos os tamanhos e orientações de tela, mas o valor layout_height pode ser calculado e definido programaticamente - um pouco confuso, mas resolve os dois problemas.
jk7
-3

Este é WAI. O NestedScrollView mede seus filhos com a especificação "Não especificada". A criança também pode crescer o quanto quiser.

Isso basicamente equivale à altura de NSV e RV. Portanto, no que diz respeito ao RV, ele acredita que está completamente exposto.

Envolva seu RV com um LL e dê altura a ele. O LL não definiria a especificação de medida como NÃO ESPECIFICADA, de modo que o RV rolaria corretamente dentro de sua altura definida de quaisquer DPs fornecidos.

A única desvantagem deste método é que você não será capaz de fazer uma correspondência dos pais em seu RV.

Muhammad Ahmed AbuTalib
fonte