Eu tenho um layout android que tem um scrollView
com um número de elementos nele. Na parte inferior do scrollView
eu tenho um listView
que é preenchido por um adaptador.
O problema que estou enfrentando é que o Android está excluindo o listView
do, scrollView
pois o scrollView
já possui uma função com capacidade de rolagem. Desejo listView
que o conteúdo seja o máximo possível e que a exibição de rolagem principal possa ser rolada.
Como posso conseguir esse comportamento?
Aqui está o meu layout principal:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >
<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
Eu, então, programaticamente adicionar meus componentes ao linearlayour com o ID: foodItemActvity_linearLayout_fragments
. Abaixo está uma das vistas carregadas nesse layout linear. Este é o que está me dando problemas com os pergaminhos.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/fragment_dds_review_textView_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reviews:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ListView
android:id="@+id/fragment_dds_review_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
Meu adaptador então preenche esta exibição de lista.
Aqui está uma imagem do visualizador de hierarquia do Android quando clico no scrollView principal:
Como você pode ver, está excluindo a lista de comentários.
Eu deveria ser capaz de rolar a página para baixo e ver 8 resenhas, mas, em vez disso, mostra apenas essas 3, e posso rolar na pequena parte em que as resenhas estão. Quero uma rolagem de página global
fonte
Respostas:
A solução mais curta e fácil para qualquer ChildView rolar dentro de um ScrollView . Qualquer coisa como ListView, RecyclerView, etc. Você não precisa fazer nada de especial no código.
Basta substituir o ScrollView por android.support.v4.widget.NestedScrollView no seu xml atual e, em seguida, a mágica acontece.
Abaixo está um exemplo de código xml:
Agora você pode se livrar de todos os hacks feios que fizemos para contornar essa rolagem aninhada.
É hora de jogar. Inferno Yeeeeeeeeeeeeeeeeeah!
fonte
requestLayout()
método redundante - setLayoutParams já o faz.view.measure(MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
A resposta é simples e estou surpreso que ainda não tenha sido respondida aqui.
Use um
Header View
ou / eFooter View
na própria lista. Não misture umScrollView
com umListView
ou qualquer coisa que possa rolar. É para ser usado com cabeçalhos e rodapés :)Essencialmente, pegue todo o conteúdo acima do seu ListView, coloque-o em outro arquivo .xml como um layout e, em seguida, no inflate do código, adicione-o à lista como uma exibição de cabeçalho.
ie
fonte
Sei que já faz tanto tempo, mas também tenho esse problema, tentei esta solução e está funcionando. Então acho que também pode ajudar os outros.
Eu adiciono android: fillViewport = "true" no xml de layout para o scrollView. Então, no geral, o meu ScrollView será assim.
E isso funciona como mágica para mim. o ListView localizado dentro do meu ScrollView se expande novamente para seu tamanho.
Aqui está o código de exemplo completo para o ScrollView e o ListView.
fonte
Você cria um ListView personalizado que não é rolável
No arquivo de recursos de layout
No arquivo Java Crie um objeto do seu customListview em vez do ListView, como: NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);
fonte
você pode usar esse código para listview em scrollview
fonte
ListView
insideRecyclerView
mostre mais do que o primeiro elemento.Você pode resolvê-lo adicionando
android:fillViewport="true"
ao seu ScrollView.antes de usar essa propriedade, havia apenas um filho da minha exibição em lista visível. depois de usar, todas as linhas ou filhos da lista ficam visíveis.
fonte
Não faça nada no Parent ScrollView. Faça isso apenas no ListView filho. Tudo vai funcionar perfeitamente.
fonte
Esse código resolverá seu problema se você tiver implementado apenas um ListView em um código.
Se você estiver usando RelativeLayout como filho ListView, esse código retornará uma NullPointerException aqui listItem.measure (0, 0); , por causa do RelativeLayout. E a solução coloca seu Relativelayout dentro de um LinearLayout e funcionará bem.
fonte
Vou deixar aqui caso alguém enfrente o mesmo problema. Eu tive que colocar um ListView dentro de um ScrollView. O ListView com cabeçalho não era uma opção por vários motivos. Nem havia uma opção para usar LinearLayout em vez de ListView. Por isso, segui a solução aceita, mas não funcionou porque os itens da lista tinham um layout complexo com várias linhas e cada item da listview tinha altura variável. A altura foi medida incorretamente. A solução foi medir cada item dentro do método getView () do adaptador ListView.
fonte
Você pode facilmente colocar o ListView no ScrollView! Só é necessário alterar a altura do ListView programaticamente , desta forma:
Isso funciona perfeitamente!
fonte
Feito após muita pesquisa e desenvolvimento:
fragment_one.xml deve se parecer com:
Sua classe Java do FragmentOne.java se parece com:
onCreateView
fonte
Eu tive um problema semelhante ao problema apresentado pelo Pôster original - como fazer a exibição da lista rolar dentro da exibição da rolagem - e essa resposta resolveu meu problema. Desabilitar a rolagem de um ListView contido em um ScrollView
Eu não chamei novos fragmentos para layouts existentes ou algo parecido, como o OP estava fazendo, então meu código ficaria assim:
Basicamente, o que estou fazendo é verificar o tamanho da lista de exibição antes de chamá-lo e, quando o chamo, faço o mesmo. Na sua classe java, use esta função:
E chame a função assim:
O resultado é uma exibição de lista sem barra de rolagem, com todo o comprimento da exibição de lista, que rola com a barra de rolagem da exibição de rolagem.
fonte
Como outros já mencionaram, não use o ListView dentro de um ScrollView.
Para contornar o problema, você pode usar um LinearLayout, mas ainda assim manter as coisas organizadas - preencha seu LinearLayout com um adaptador, o mesmo que com um ListView
Você pode usar essa classe como uma substituição LinearLayout que suporta adaptadores
fonte
Você pode colocar tudo no layout linear. Ou seja, crie um layout linear e ele terá 2 filhos, scrollview e outro layout linear. Dê a eles pesos de layout e aqui está:
fonte
Você nunca deve usar um ScrollView com um ListView, porque o ListView cuida de sua própria rolagem vertical. Mais importante ainda, fazer isso derrota todas as otimizações importantes no ListView para lidar com listas grandes, pois efetivamente força o ListView a exibir sua lista inteira de itens para preencher o contêiner infinito fornecido pelo ScrollView.
http://developer.android.com/reference/android/widget/ScrollView.html
fonte
Meu requisito é incluir um ListView de itens de tamanho igual em um ScrollView. Tentei algumas das outras soluções listadas aqui, nenhuma parecia dimensionar o ListView corretamente (com pouco espaço ou muito). Aqui está o que funcionou para mim:
Espero que isso ajude alguém.
fonte
NUNCA coloque um
ListView
interior de umScrollView
! Você pode encontrar mais informações sobre esse tópico no Google . No seu caso, use a emLinearLayout
vez deListView
e adicione os elementos programaticamente.fonte
Atualizar
para
O ponto aqui é que você está tentando definir a altura como 0dp (fixo)
fonte
Encontrei uma solução para scrollview -> viewpager -> FragmentPagerAdapter -> fragmento -> listview dinâmico, mas não sou o autor. existem alguns bugs, mas pelo menos funciona
layout de fragmentos pode ser qualquer coisa
então em algum lugar apenas
fonte
Para usar a exibição de lista dentro da Rolagem, você pode seguir estas etapas que funcionaram para mim:
1) Crie um arquivo java NonScrollListView que desabilite a propriedade de rolagem padrão da exibição em lista. e o código está abaixo
2) Agora crie um arquivo xml que possui
NestedScrollView
e dentro desse usoNonScrollListView
para listar seus itens. Isso fará com que sua tela inteira role com todas as visualizações.3) Agora na classe java, ou seja, home.java define em
NonScrollListView
vez deListview
.casa de classe pública estende o fragmento {int pos = 0; ViewFlipper v_flipper;
Nota: eu usei
Fragments
aqui.fonte
Ok, aqui está a minha resposta. O método que corrige a altura do ListView está fechado o suficiente, mas não é perfeito. Caso a maioria dos itens tenha a mesma altura, isso funcionará bem. Mas, caso isso não ocorra, há um grande problema. Eu tentei várias vezes e, quando coloco o valor de listItem.getMeasureHeight e listItem.getMeasuerWidth no log, vi que os valores de largura variam muito, o que não é esperado aqui, pois todos os itens no mesmo ListView devem tem a mesma largura. E lá vai o bug:
Alguns usaram a medida (0, 0), que na verdade tornou a exibição ilimitada, tanto na direção quanto na largura. Alguns tentaram obter a largura do listView, mas retornou 0, sem sentido.
Quando eu leio mais detalhadamente como o Android renderiza a View, percebo que toda essa tentativa não pode alcançar a resposta que eu procurei, a menos que essas funções sejam executadas após a exibição da renderização.
Dessa vez, uso o getViewTreeObserver no ListView que desejo corrigir a altura e depois adicionoOnGlobalLayoutListener. Dentro desse método, declaro um novo OnGlobalLayoutListener, no qual, desta vez, getWidth retornará a largura real do ListView.
O valor pad, é o preenchimento que defini no layout do ListView.
fonte
Se, por algum motivo, você não quiser usar
addHeaderView
eaddFooterView
, por exemplo, quando tiver várias listas, uma boa idéia seria reutilizarListAdapter
para preencher um simplesLinearLayout
para que não haja funcionalidade de rolagem.Se você já possui um fragmento inteiro derivado
ListFragment
e deseja convertê-lo em um fragmento semelhante com simplesLinearLayout
sem precisar rolar (por exemplo, para colocá-lo no ScrollView), é possível implementar um fragmento do adaptador como este:Você também pode querer encaminhar
onCreate
,onPause
,onResume
, etc, para o fragmento originais dependendo de suas necessidades ou tente herança em vez de composição (mas substituir determinados métodos tão fragmento original não é realmente ligado a hierarquia de layout); mas eu queria isolar o fragmento original o máximo possível, porque só precisamos extraí-loListAdapter
. Se você chamar fragmentos originaissetListAdapter
emonAttach
, isso é provavelmente suficiente.Veja como usar
ListAsArrayFragment
para incluirOriginalListFragment
sem rolar. Nas atividades dos paisonCreate
:fonte
Encontrei uma solução para scrollview -> viewpager -> FragmentPagerAdapter -> fragmento -> listview dinâmico, mas não sou o autor.
layout de fragmentos pode ser qualquer coisa
então em algum lugar apenas
fonte
usando este ListView funcionou para mim
e em xml
e em MainActivity
Consulte este artigo para obter mais informações e também para saber como manter o gridview dentro da visualização de rolagem
fonte
Em xml:
Em Java:
fonte
Basta definir o valor da altura necessária em um atributo de altura da lista de exibição dentro de uma exibição de rolagem pai. Ele irá rolar junto com o item filho de outros pais.
fonte
Isso funcionou para mim ( link1 , link2 ):
Você cria um ListView personalizado que não é rolável
Em seu arquivo de layout
Crie um objeto do seu customListview em vez do ListView, como:
fonte
Basta chamar esta função depois de atribuir o adaptador à lista
fonte
fonte
melhor código
fonte