Estou tendo problemas com uma rolagem ListView
dentro de um ScrollView
. Eu tenho uma atividade que tem alguns EditTexts na parte superior e, em seguida, um host de guias com duas guias que possuem um ListView cada. Quando as visualizações EditText são focadas, o teclado virtual aparece e, como eu tenho um ScrollView, o conteúdo é rolável. Mas o problema ocorre quando há mais itens no ListViews (aqueles em guias), não consigo rolar o ListView, mesmo que haja mais itens.
A seguir está o XML do layout:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?backgroundImage"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:layout_alignParentBottom="true"
android:layout_margin="10dip"
android:id="@+id/buttons">
<Button
android:text="Save"
android:layout_margin="2dip"
android:textSize="20dip"
android:id="@+id/btnSaveorUpdate"
android:layout_height="wrap_content"
android:layout_width="145dip"></Button>
<Button
android:text="Cancel"
android:layout_margin="2dip"
android:textSize="20dip"
android:id="@+id/btnCancelorDelete"
android:layout_height="wrap_content"
android:layout_width="145dip"></Button>
</LinearLayout>
<ScrollView
android:layout_above="@id/buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:layout_margin="10dip">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="10dip">
<TextView
android:text="Bill details"
android:textColor="?textColorDark"
android:layout_alignParentTop="true"
android:id="@+id/txtEnterDetails"
android:textSize="25dip"
android:textStyle="bold"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_marginBottom="2dip"></TextView>
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0dip"
android:layout_height="0dip" />
<EditText
android:layout_width="fill_parent"
android:hint="Enter data"
android:inputType="numberDecimal"
android:id="@+id/txtSample"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:text=""></EditText>
<EditText
android:layout_width="fill_parent"
android:id="@+id/txtDescription"
android:hint="Enter description"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:inputType="text"
android:text=""></EditText>
<EditText
android:layout_width="fill_parent"
android:id="@+id/txtComment"
android:hint="Enter comment (if any)"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:inputType="text"
android:text=""></EditText>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txtDate"
android:layout_width="wrap_content"
android:text=""
android:textSize="20dip"
android:textColor="?textColorDark"
android:layout_marginLeft="10dip"
android:layout_height="@dimen/editTextHeight"
android:layout_gravity="center_vertical" />
<Button
android:id="@+id/btnPickDate"
android:layout_width="wrap_content"
android:layout_height="@dimen/editTextHeight"
android:text="Select date"
android:layout_margin="2dip"
android:textSize="15dip"
android:layout_gravity="center_vertical" />
</LinearLayout>
<TabHost
android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TabWidget
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@android:id/tabs"></TabWidget>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/tabcontent">
<ScrollView
android:layout_above="@id/buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:id="@+id/tab1">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TableLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TableRow
android:id="@+id/tableRow1"
android:layout_marginLeft="2dip"
android:layout_marginRight="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:src="@drawable/ic_menu_invite"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_gravity="center_vertical"></ImageView>
<TextView
android:text="Add friend"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_centerVertical="true"
android:textColor="?textColorDark"
android:textSize="@dimen/editText"
android:layout_gravity="center_vertical" />
</LinearLayout>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip">
<TextView
android:id="@+id/txtData1"
android:layout_width="170dip"
android:layout_height="wrap_content"
android:text="Data"
android:textSize="14dip"
android:textStyle="bold"
android:textColor="#000000">
</TextView>
<TextView
android:id="@+id/txtData2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sample"
android:textSize="13dip"
android:textColor="#000000"></TextView>
</TableRow>
</TableLayout>
<ListView
android:cacheColorHint="#00000000"
android:id="@+id/ListView01"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
</LinearLayout>
</ScrollView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:id="@+id/tab2"
android:orientation="vertical">
<TableLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TableRow
android:id="@+id/tableRow2"
android:layout_marginLeft="2dip"
android:layout_marginRight="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:src="@drawable/ic_menu_invite"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_gravity="center_vertical"></ImageView>
<TextView
android:text="Sample"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_centerVertical="true"
android:textColor="?textColorDark"
android:textSize="@dimen/editText"
android:layout_gravity="center_vertical" />
</LinearLayout>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip">
<TextView
android:id="@+id/txtUser1"
android:layout_width="170dip"
android:layout_height="wrap_content"
android:text="User"
android:textSize="14dip"
android:textStyle="bold"
android:textColor="#000000">
</TextView>
<TextView
android:id="@+id/txtUserData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UserData"
android:textSize="13dip"
android:textColor="#000000"></TextView>
</TableRow>
</TableLayout>
<ListView
android:cacheColorHint="#00000000"
android:id="@+id/ListView02"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
</LinearLayout>
</ScrollView>
</RelativeLayout>
Por favor, alguém pode me dizer qual é o problema aqui? Eu tenho outro post sobre o ListView dentro do problema ScrollView, mas eles não foram úteis no meu caso.
android
listview
android-layout
scrollview
Ashwani K
fonte
fonte
Respostas:
Você não deve colocar um
ListView
dentro de aScrollView
porque aListView
classe implementa sua própria rolagem e simplesmente não recebe gestos porque todos são tratados pelo paiScrollView
. Eu recomendo fortemente que você simplifique seu layout de alguma forma. Por exemplo, você pode adicionar visualizações que deseja rolar para osListView
cabeçalhos ou rodapés.ATUALIZAÇÃO :
A partir do nível de API 21 (Lollipop), os contêineres de rolagem aninhados são oficialmente suportados pelo Android SDK. Existem vários métodos
View
eViewGroup
classes que fornecem essa funcionalidade. Para fazer a rolagem aninhada funcionar no Lollipop, você deve habilitá-la para uma exibição de rolagem filho adicionandoandroid:nestedScrollingEnabled="true"
à sua declaração XML ou chamando explicitamentesetNestedScrollingEnabled(true)
.Se você deseja fazer a rolagem aninhada funcionar em dispositivos pré-pirulito, o que provavelmente faz, é necessário usar as classes de utilitário correspondentes da biblioteca de Suporte. Primeiro você precisa substituí-lo
ScrollView
pelo NestedScrollView . O último implementa NestedScrollingParent e NestedScrollingChild, para que possa ser usado como um pai ou um contêiner de rolagem filho.Mas
ListView
não suporta rolagem aninhada, portanto, é necessário subclassificá-lo e implementá-loNestedScrollingChild
. Felizmente, a biblioteca de suporte fornece a classe NestedScrollingChildHelper , então você só precisa criar uma instância dessa classe e chamar seus métodos a partir dos métodos correspondentes da sua classe de exibição.fonte
ListView
seria estranho. Mas seu layout é muito, muito complicado. Eu nem consigo entender como você quer que seja. De qualquer forma, é melhor simplificá-lo porque umListView
aninhado em umScrollView
aninhado em outroScrollView
parece estranho e não funcionará.Encontrei uma solução que funciona excelentemente e pode rolar o
ListView
sem problemas:O que isto faz é desativar os
TouchEvent
s noScrollView
eListView
interceptá-los. É simples e funciona o tempo todo.fonte
Eu também tenho uma solução. Eu sempre uso esse método. Tente isto
Classe NestedListView.java:
fonte
LinearLayout
vez de A.ListView
Isso significa que se você tiver um grande número de itens de lista (ou itens de lista complexos)) em seguida, os dispositivos Android vai demorar muito tempo para abrir a atividade (ou até mesmo travar ao tentar no meu caso).Você só precisa substituir o seu
<ScrollView ></ScrollView>
por esteCustom ScrollView
como<com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >
fonte
Eu tive um mesmo problema e, enquanto pesquisava, encontrei sua pergunta. Sim resposta marcada funcionou para mim também, mas houve algum problema.
Enfim, encontrei outra solução . que funciona perfeitamente sem fazer malabarismos.
fonte
fonte
Aqui está o método exato de usar o Listview no Scrollview. Tudo o que temos para lidar com eventos de toque.
fonte
Use o seguinte método e divirta-se!
listViewTouchAction é um valor inteiro global. Se você pode substituir a linha
com outra coisa, compartilhe conosco.
Aproveitar!
fonte
É uma prática ruim ter duas visualizações de rolagem diferentes juntas. O ListView em si tem sua própria funcionalidade de rolagem e a altura é ajustada automaticamente de acordo com as configurações do adaptador para seus itens de linha (lembrando, não estamos definindo altura específica para ListView em nosso layout xml). No entanto, no seu caso, você pode substituir o ListView por uma classe e isso ajustará a altura do seu ListView, lembrando que o ListView está dentro do ScrollView.
Isso irá ajudá-lo:
Agora estenda seu ListView com essa classe, basta alterar sua tag do ListView do seu xml de recurso para algo assim,
Isso resolverá o problema de rolagem do ListView, pois agora a rolagem pai é gerenciada pelo ScrollView e não pelo ListView.
fonte
Sei que essa pergunta foi feita há muito tempo, mas quem está preso por enquanto pode resolver isso adicionando esta linha ao seu ListView
Por exemplo -
fonte
Eu tenho problema semelhante e resolvi criando classe personalizada, estendendo com ListView.
ScrollableListView.java
Uso:
fonte
Demo_ListView_In_ScrollView
==============================
========================
listview_adapter
==========================
===================================
Classe auxiliar
====================================
========================
demo_listview_in_scrollview_activity.xml
========================
================
item_list_xml.xml
==================
fonte
A melhor solução é usar o NestedScrollVew com o RecyclerView ou, se você quiser usar o Listview, poderá adicionar isso à exibição de cabeçalho e rodapé. Por exemplo:
fonte
Eu tentei e testei quase todos os métodos mencionados acima, confie em mim, depois de fugir completamente do RecyclerView, substituí meu ListView pelo RecyclerView e ele funcionou perfeitamente. Não precisava de nenhuma biblioteca de terceiros para o ExtendedHeightListView e tudo, apenas o RecyclerView simples e simples.
Aqui está o meu arquivo de layout antes do reciclador
ISTO APÓS SUBSTITUIR MINHA LISTA DE VISITAS COM UMA DAS MUITAS SOLUÇÕES mencionadas acima. Portanto, o problema era que o listview não estava se comportando corretamente devido a 2 erros de scrollview (talvez não um bug) no android.
Substituí a vista com reciclador para formar o meu layout final.
Este é o meu adaptador de exibição de reciclador:
E este é o meu layout personalizado do RecyclerView:
E VOILA, obtive o efeito desejado do ListView (Now RecyclerView) dentro de um scollview. Heres a imagem final da interface do usuário
Em uma nota final, acredito que substituir o RecyclerView foi uma escolha melhor para mim, pois melhorou a estabilidade geral do aplicativo e também me ajudou a entender melhor o RecyclerView. Se eu sugerir uma solução, vou dizer para substituir o seu ListView por um RecyclerView.
fonte
A solução acima dada por @Shailesh Rohit funciona perfeitamente bem. Alguns truques precisam ser feitos.
Se você estiver colocando a classe auxiliar dentro da mesma classe (classe principal), torne a classe Helper como estática e getListViewSize () não seja estático.
Mais importante, escreva "Helper.getListViewSize (listView);" declaração após configurar o adaptador pela primeira vez como "listView.setAdapter (myAdapter);" assim como sempre que você estiver usando "myAdapter.notifyDataSetChanged ();"
O uso é mostrado abaixo.
listView = (ListView) findViewById (R.id.listView); myAdapter = new ArrayAdapter (this, android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (listView);
myAdapter.notifyDataSetChanged (); Helper.getListViewSizelistView (listView);
fonte
Conforme De acordo comigo, enquanto você estiver usando setOnTouchListener om pai ou filho, pare a rolagem do pai enquanto toca no filho ou então pare a rolagem do filho enquanto toca no pai
fonte
Tente isso com o ScrollView, não com o ListView.
fonte
requestDisallowInterceptTouchEvent (boolean disallowIntercept)
Tente esta resposta,
fonte
substitua o ListView pelo RecycleView dentro do ScrollView. funciona sem problemas com código fonte adicional:
fonte
Para o ListView dentro do ScrollView, use o NestedScrollView, ele pode lidar com essa funcionalidade com muita facilidade:
fonte
Eu tive esse erro. E minha solução é a seguinte:
1. Crie uma exibição de lista personalizada que não seja rolável
}
2. Use a classe personalizada acima para o arquivo xml
Espero que seja melhor para você.
fonte
Encontrei uma solução para isso. Em vez de usar o scrollview, você pode usar o addHeaderview e o addFooterview do listview
Aqui está o meu trecho,
Agora, com a lista de exibição, seu layout também pode ser rolado. Aproveite!!!
fonte
Substitua o ScrollView por android.support.v4.widget.NestedScrollView dentro do xml. corre
1) Use em XML ::::
android.support.v4.widget.NestedScrollView
ao invés de::::
ScrollView
2) E use para exibição de lista dessa maneira usando NonScrollListView no arquivo cs:
3) Finalmente, use este código para identificar o scrollview no arquivo cs:
fonte
Best Code
fonte
Adicionar:
android:nestedScrollingEnabled="true"
fonte
Use este método e sua exibição de lista se torna rolável dentro do scrollview: -
fonte
Você não pode adicionar um ListView a uma exibição de rolagem, pois a exibição de lista também ocorre e haveria um problema de sincronização entre a rolagem de exibição de lista e a exibição de rolagem. Você pode criar uma exibição CustomList e adicionar esse método a ela.
fonte
Não dê a visualização de rolagem
ListView
, porque ela tem essa configuração padrãofonte