Não consigo desativar a rolagem no RecyclerView
. Tentei ligar, rv.setEnabled(false)
mas ainda posso rolar.
Como posso desativar a rolagem?
android
scroll
android-recyclerview
Zsolt Safrany
fonte
fonte
RecyclerView
se você não deseja rolar?View
por cima doRecyclerView
, alternando entreVISIBLE
eGONE
conforme necessário, mas fora do manguito sua abordagem parece razoável.Respostas:
Você deve substituir o gerenciador de layout da sua revisão de reciclagem por isso. Dessa forma, apenas desabilitará a rolagem, nenhuma das outras funcionalidades. Você ainda poderá lidar com cliques ou outros eventos de toque. Por exemplo:-
Original:
Aqui, usando o sinalizador "isScrollEnabled", você pode ativar / desativar a funcionalidade de rolagem da sua exibição de reciclagem temporariamente.
Além disso:
Simples substitua sua implementação existente para desativar a rolagem e permitir o clique.
fonte
A resposta real é
Mais informações na documentação
fonte
NestedScrollView
:android.support.v4.widget.NestedScrollView
, como descrito aqui, por chessdork: stackoverflow.com/questions/37846245/...A resposta REAL REAL é: Para API 21 e superior:
Nenhum código java necessário. Você pode definir
android:nestedScrollingEnabled="false"
em xml:fonte
Esta solução é um pouco tola, mas funciona; você pode ativar / desativar a rolagem no
RecyclerView
.Este é um
RecyclerView.OnItemTouchListener
evento de roubo a cada toque, desabilitando o alvoRecyclerView
.Usando isso:
fonte
Isso funciona para mim:
fonte
Custom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
return e.getAction() == MotionEvent.ACTION_MOVE;
vez disso , apenas os eventos dereturn true;
rolagem / deslize são cancelados.Você pode desativar a rolagem congelando o RecyclerView.
Congelar:
recyclerView.setLayoutFrozen(true)
Para descongelar:
recyclerView.setLayoutFrozen(false)
fonte
Criar classe que estenda a classe RecyclerView
Isso desativará o evento de rolagem, mas não os eventos de clique
Use isso em seu XML, faça o seguinte:
fonte
Se você apenas desativar a funcionalidade de rolagem
RecyclerView
, poderá usar osetLayoutFrozen(true);
método deRecyclerView
. Mas não pode ser desativado o evento de toque.fonte
fonte
Existe uma resposta muito simples.
O código acima desabilita a rolagem vertical do RecyclerView.
fonte
Outra alternativa é
setLayoutFrozen
, mas ela vem com vários outros efeitos colaterais.https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setLayoutFrozen(boolean)
fonte
Escreveu uma versão do kotlin:
uso:
fonte
Estenda
LayoutManager
e substituacanScrollHorizontally()
ecanScrollVertically()
para desativar a rolagem.Esteja ciente de que a inserção de itens no início não voltará automaticamente para o início; para contornar isso, faça algo como:
fonte
Sei que isso já tem uma resposta aceita, mas a solução não leva em consideração um caso de uso que me deparei.
Eu precisava especificamente de um item de cabeçalho que ainda pudesse ser clicado, mas desabilitei o mecanismo de rolagem do RecyclerView. Isso pode ser feito com o seguinte código:
fonte
Como
setLayoutFrozen
foi descontinuado, você pode desativar a rolagem congelando o RecyclerView usandosuppressLayout
.Congelar:
Para descongelar:
fonte
em XML: -
Você pode adicionar
android:nestedScrollingEnabled="false"
no arquivo XML de layout filho do RecyclerView
ou
em Java: -
childRecyclerView.setNestedScrollingEnabled(false);
ao seu RecyclerView em código Java.
Usando o ViewCompat (Java): -
childRecyclerView.setNestedScrollingEnabled(false);
funcionará apenas em android_version> 21 dispositivos. para funcionar em todos os dispositivos, use o seguinteViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
fonte
Por alguma razão, a resposta do @Alejandro Gracia começa a funcionar apenas após alguns segundos. Encontrei uma solução que bloqueia o RecyclerView instantaneamente:
fonte
Substitua onTouchEvent () e onInterceptTouchEvent () e retorne false se você não precisar do OnItemTouchListener. Isso não desativa OnClickListeners de ViewHolders.
fonte
Você pode adicionar esta linha depois de configurar seu adaptador
Agora, a sua reciclagem funcionará com rolagem suave
fonte
Estou enfrentando problemas nesta questão há algumas horas. Por isso, gostaria de compartilhar minha experiência. Para a solução layoutManager, está bom, mas se você quiser reativar a rolagem, a recicladora voltará ao topo.
A melhor solução até agora (pelo menos para mim) é usar o método @Zsolt Safrany, mas adicionar getter e setter para que você não precise remover ou adicionar o OnItemTouchListener.
Como se segue
Uso
fonte
No Kotlin, se você não quiser criar uma classe extra apenas para definir um valor, poderá criar uma classe anônima no LayoutManager:
fonte
Aqui está como eu fiz isso com ligação de dados:
No lugar de "true", usei uma variável booleana que foi alterada com base em uma condição para que a exibição do reciclador alternasse entre ser desativado e ativado.
fonte
Me deparei com um fragmento que contém vários RecycleView, então eu só preciso de uma barra de rolagem em vez de uma barra de rolagem em cada RecycleView.
Então, basta colocar o ScrollView no contêiner pai que contém os 2 RecycleViews e usá-lo
android:isScrollContainer="false"
no RecycleViewfonte
Adicionar
em seu filho SrollView ou NestedScrollView (e pai de ListView, recyclerview e gridview qualquer um)
fonte
Existe uma maneira mais direta de desativar a rolagem (tecnicamente, é mais a interceptação de um evento de rolagem e a finalização quando uma condição é atendida), usando apenas a funcionalidade padrão.
RecyclerView
tem o método chamadoaddOnScrollListener(OnScrollListener listener)
, e usando apenas isso, você pode impedir a rolagem, da seguinte maneira:Caso de uso: digamos que você deseja desativar a rolagem ao clicar em um dos itens dentro
RecyclerView
para poder executar algumas ações com ele, sem se distrair ao rolar acidentalmente para outro item e, quando terminar, basta clicar em o item novamente para ativar a rolagem. Para isso, você gostaria de anexarOnClickListener
a todos os itens contidos neleRecyclerView
; portanto, quando você clica em um item, ele alternaisItemSelected
defalse
paratrue
. Dessa forma, quando você tentar rolar,RecyclerView
chamará automaticamente o métodoonScrollStateChanged
e, comoisItemSelected
definido comotrue
, será interrompido imediatamente, antes deRecyclerView
ter a chance, bem ... de rolar.Nota: para uma melhor usabilidade, tente usar em
GestureListener
vez deOnClickListener
impediraccidental
cliques.fonte
stopScroll()
não é congelar o pergaminho, é apenas parar / parar a rolagem da reciclagem.isItemSelected
definido comotrue
. Caso contrário, você precisaria de um RecyclerView personalizado para desativar a rolagem definitiva e eu queria evitá-la, pois precisava de apenas algumas funcionalidades extras, fornecidas por esta solução.Adicione isso à sua revisão de reciclagem em xml
como isso
fonte
Para interromper a rolagem por toque, mas continue rolando através de comandos:
if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);
fonte