Estou tentando trabalhar com o novo RecyclerView
, mas não consegui encontrar um exemplo de um RecyclerView
com diferentes tipos de linhas / visualizações de cartões sendo infladas.
Com ListView
I substituir o getViewTypeCount
e getItemViewType
, para lidar com diferentes tipos de linhas.
Devo fazê-lo da maneira "antiga" ou devo fazer alguma coisa LayoutManager
? Fiquei me perguntando se alguém poderia me indicar a direção certa. Porque só consigo encontrar exemplos com um tipo.
Quero ter uma lista de cartões ligeiramente diferentes. Ou devo apenas usar um scrollView
com cardViews
dentro dele ... torná-lo sem o adaptador e recyclerView
?
android
listview
android-recyclerview
Lokkio
fonte
fonte
Respostas:
Lidar com a lógica de linhas / seções semelhante ao UITableView do iOS não é tão simples no Android quanto no iOS, no entanto, quando você usa o RecyclerView - a flexibilidade do que você pode fazer é muito maior.
No final, é tudo sobre como você descobre que tipo de exibição está exibindo no adaptador. Depois que você descobrir isso, deve ser fácil navegar (não realmente, mas pelo menos você terá isso resolvido).
O adaptador expõe dois métodos que você deve substituir:
A implementação padrão desse método sempre retornará 0, indicando que há apenas 1 tipo de visualização. No seu caso, não é assim e, portanto, você precisará encontrar uma maneira de afirmar qual linha corresponde a qual tipo de visualização. Ao contrário do iOS, que gerencia isso para você com linhas e seções, aqui você terá apenas um índice em que confiar e precisará usar suas habilidades de desenvolvedor para saber quando uma posição se correlaciona com um cabeçalho de seção e quando se correlaciona com uma linha normal.
Você precisa substituir esse método de qualquer maneira, mas geralmente as pessoas simplesmente ignoram o parâmetro viewType. De acordo com o tipo de exibição, você precisará aumentar o recurso de layout correto e criar seu suporte de exibição de acordo. O RecyclerView lidará com a reciclagem de diferentes tipos de vistas, de forma a evitar conflitos de diferentes tipos de vistas.
Se você planeja usar um LayoutManager padrão, como
LinearLayoutManager
você deve estar pronto. Se você planeja criar sua própria implementação do LayoutManager, precisará trabalhar um pouco mais. A única API com a qual você realmente precisa trabalhar é afindViewByPosition(int position)
que fornece uma determinada visualização em uma determinada posição. Como você provavelmente deseja definir de maneira diferente, dependendo do tipo dessa visualização, você tem algumas opções:Geralmente, ao usar o padrão ViewHolder, você define a etiqueta da vista com o suporte da vista. Você pode usar isso durante o tempo de execução no gerenciador de layout para descobrir que tipo de visualização é adicionando um campo no suporte da visualização que expressa isso.
Como você precisará de uma função que determine qual posição se correlaciona a qual tipo de exibição, você também pode tornar esse método acessível globalmente de alguma forma (talvez uma classe singleton que gerencia os dados?) E, em seguida, você pode simplesmente consultar o mesmo método de acordo com a posição.
Aqui está um exemplo de código:
Aqui está uma amostra de como esses detentores de exibição devem se parecer:
Obviamente, este exemplo assume que você construiu sua fonte de dados (myData) de uma maneira que facilita a implementação de um adaptador dessa maneira. Como exemplo, mostrarei como construir uma fonte de dados que mostre uma lista de nomes e um cabeçalho para cada vez que a primeira letra do nome for alterada (suponha que a lista esteja em ordem alfabética) - semelhante à maneira como os contatos lista ficaria assim:
Este exemplo vem para resolver um problema bastante específico, mas espero que isso lhe dê uma boa visão geral sobre como lidar com diferentes tipos de linhas em uma recicladora e permita que você faça as adaptações necessárias em seu próprio código para atender às suas necessidades.
fonte
names[i].substring(0, 1)
onCreateViewHolder
que nos ajudará a criar o detentor da visualização. Para mais detalhes você pode querer verificar a minha parte: stackoverflow.com/questions/47245398/...O truque é criar subclasses do ViewHolder e depois convertê-las.
E então, em tempo de execução, faça algo assim:
Espero que ajude.
fonte
De acordo com a grande resposta de Gil, resolvi substituindo o getItemViewType, conforme explicado por Gil. Sua resposta é ótima e precisa ser marcada como correta. De qualquer forma, adiciono o código para alcançar a pontuação:
No seu adaptador de reciclador:
Ao fazer isso, você pode definir qualquer layout personalizado para qualquer linha!
fonte
É bastante complicado, mas muito difícil, basta copiar o código abaixo e pronto
desfrutar !!!!
fonte
Podemos obter várias visualizações no RecyclerView único a partir do caminho abaixo: -
Dependências do Gradle, adicione o código abaixo: -
RecyclerView em XML
Código da atividade
Primeiro XML
Segundo XML
Terceiro XML
Agora é hora de fazer o adaptador, e isso é importante para mostrar diferentes vistas -2 na mesma exibição do reciclador, portanto, verifique este foco do código completamente: -
Você também pode verificar este link para obter mais informações.
fonte
Você precisa implementar o
getItemViewType()
métodoRecyclerView.Adapter
. Por padrão, aonCreateViewHolder(ViewGroup parent, int viewType)
implementaçãoviewType
desse método retorna0
. Primeiramente, é necessário visualizar o tipo do item na posição para fins de visualização da reciclagem e para isso é necessário substituir ogetItemViewType()
método pelo qual você pode passar, oviewType
que retornará sua posição do item. A amostra de código é fornecida abaixofonte
getItemViewType (int position) é a chave
Como fazer isso ?
Você pode criar um
RecyclerView
com qualquer número de modos de exibição diferentes (ViewHolders). Mas, para melhor legibilidade, vamos dar um exemploRecyclerView
com doisViewholders
.Lembre-se destes 3 passos simples e você estará pronto para prosseguir.
getItemViewType(int position)
ViewType
método in onCreateViewHolder ()Preencher Visualização com base no itemViewType no
onBindViewHolder()
métodoAqui está um trecho de código para você
Código GitHub:
Aqui está um projeto em que implementei um RecyclerView com vários ViewHolders.
fonte
Você pode simplesmente retornar ItemViewType e usá-lo. Veja o código abaixo:
fonte
Você pode usar a biblioteca: https://github.com/vivchar/RendererRecyclerViewAdapter
Para cada item, você deve implementar um ViewRenderer, ViewHolder, SomeModel:
ViewHolder - é um suporte simples para a visão do reciclador.
SomeModel - é o seu modelo com
ItemModel
interfacePara mais detalhes, você pode procurar documentações.
fonte
Você pode usar esta biblioteca:
https://github.com/kmfish/MultiTypeListViewAdapter (escrito por mim)
Adaptador de instalação:
Para cada item de linha:
fonte