Estou enfrentando um problema muito comum: criei uma atividade e agora descobri que ela deve exibir alguns itens dentro dela ScrollView
. A maneira normal de fazer isso seria usar o existente ListAdapter
, conectá-lo a um ListView
e BOOM eu teria minha lista de itens.
MAS você não deve colocar um aninhado ListView
em uma, ScrollView
pois isso atrapalha a rolagem - até o Android Lint reclama disso.
Então aqui está minha pergunta:
Como faço para conectar ListAdapter
a a LinearLayout
ou algo semelhante?
Eu sei que esta solução não escalará para muitos itens, mas minhas listas são muito curtas (<10 itens), portanto, a reutilização de visualizações não é realmente necessária. Em termos de desempenho, posso viver colocando todas as visualizações diretamente no LinearLayout
.
Uma solução que encontrei seria colocar meu layout de atividade existente na seção headerView do ListView
. Mas parece que estou abusando desse mecanismo, então estou procurando uma solução mais limpa.
Ideias?
ATUALIZAÇÃO: para inspirar a direção certa, adiciono um layout de amostra para mostrar meu problema:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/news_detail_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:visibility="visible">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/news_detail_layout_side_padding"
android:paddingRight="@dimen/news_detail_layout_side_padding"
android:paddingTop="@dimen/news_detail_layout_vertical_padding"
android:paddingBottom="@dimen/news_detail_layout_vertical_padding"
>
<TextView
android:id="@+id/news_detail_date"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="LALALA"
android:textSize="@dimen/news_detail_date_height"
android:textColor="@color/font_black"
/>
<Gallery
android:id="@+id/news_detail_image"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingTop="5dip"
android:paddingBottom="5dip"
/>
<TextView
android:id="@+id/news_detail_headline"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="Some awesome headline"
android:textSize="@dimen/news_detail_headline_height"
android:textColor="@color/font_black"
android:paddingTop="@dimen/news_detail_headline_paddingTop"
android:paddingBottom="@dimen/news_detail_headline_paddingBottom"
/>
<TextView
android:id="@+id/news_detail_content"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Here comes a lot of text so the scrollview is really needed."
android:textSize="@dimen/news_detail_content_height"
android:textColor="@color/font_black"
/>
<!---
HERE I NEED THE LIST OF ITEMS PROVIDED BY THE EXISTING ADAPTER.
They should be positioned at the end of the content, so making the scrollview smaller is not an option.
---->
</LinearLayout>
</ScrollView>
</LinearLayout>
ATUALIZAÇÃO 2 Mudei o título para torná-lo mais fácil de entender (recebi um downvote, doh!).
fonte
Respostas:
Você provavelmente deve apenas adicionar manualmente seus itens a
LinearLayout
:EDITAR : Rejeitei essa abordagem quando precisei exibir cerca de 200 itens de lista não triviais, é muito lento - o Nexus 4 precisava de cerca de 2 segundos para exibir minha "lista", o que era inaceitável. Então eu me virei para a abordagem de Flo com cabeçalhos. Funciona muito mais rápido porque as visualizações de lista são criadas sob demanda quando o usuário rola a página, não no momento em que a visualização é criada.
Resumo: A adição manual de visualizações ao layout é mais fácil de codificar (portanto, potencialmente menos partes móveis e bugs), mas sofre de problemas de desempenho, portanto, se você tiver cerca de 50 visualizações ou mais, aconselho usar a abordagem de cabeçalho.
Exemplo. Basicamente, o layout da atividade (ou fragmento) se transforma em algo assim (não é mais necessário ScrollView):
Em seguida, em
onCreateView()
(usarei um exemplo com um fragmento), você precisará adicionar uma visualização de cabeçalho e, em seguida, definir um adaptador (presumo que o ID do recurso de cabeçalho sejaheader_layout
):fonte
ListAdapter
eListView
faz mais magia por trás das telas que eu então não fazer manualmente.notifyDataSetChanged
método do adaptador ? Isso funciona bem em um adaptador diferente que conectei a aListView
, mas não parece estar funcionando com o que conectei a aLinearLayout
.Eu ficaria com a solução de exibição de cabeçalho. Não há nada de errado nisso. No momento estou implementando uma atividade usando exatamente a mesma abordagem.
Obviamente, a "parte do item" é mais dinâmica do que estática (contagem de itens variados vs. contagem de itens fixos etc.), caso contrário, você não vai pensar em usar um adaptador. Portanto, quando você precisar de um adaptador, use o ListView.
Implementar uma solução que preenche um LinearLayout a partir de um adaptador não é nada mais do que construir um ListView com um layout personalizado.
Apenas meus 2 centavos.
fonte
ListView
. Não tenho certeza se gosto deste trabalho de patch.Defina sua visualização como main.xml onCreate e aumente a partir de row.xml
main.xml
row.xml
fonte
Eu uso o seguinte código que replica a funcionalidade do adaptador com
ViewGroup
eTabLayout
. O bom sobre isso é que, se você alterar sua lista e vincular novamente, isso afetará apenas os itens alterados:Uso:
Para
ViewGroups
:Pois
TabLayout
eu tenho isso:fonte