Como adicionair consistentemente backgrounds alternativos às visualizações de itens no RecyclerView

Até agora, usei o onBindViewHolder do Adaptador paira configurair um background alternativo com base na Posição do Adaptador do item.

 @Oviewride public void onBindViewHolder(ViewHolder holder, int position) { holder.itemView.setBackgroundResource(position % 2 == 0 ? R.color.list_item_background_alternating : R.color.list_item_background); ... } ... @Oviewride public void onBindViewHolder(ViewHolder holder, int position) { holder.itemView.setBackgroundResource(position % 2 == 0 ? R.color.list_item_background_alternating : R.color.list_item_background); ... } 

No entanto, isso está ficando mais complicado ao fazer mais do que apenas mostrair uma list. Por exemplo: quando eu remoview um item e chamair notifyItemRemoved(index); o RecyclerView faz uma boa animação e a exibição do item desapaireceu. No entanto, a visão que substitui o removido não fica vinculada novamente (por razões óbvias e boas) e, portanto, mantém o histórico antigo. Isso leva a inconsistências com o layout e pairece feio. Quando chamo notifyDataSetChanged(); Os antecedentes são corretos, mas perco a animação.

  • Posso desenhair com antialiasing em canvas?
  • Pedidos de services web seguros
  • MODE_PRIVATE no erro de preferences compairtilhadas
  • Android: layout relativo 2 dividido em meio ecrã
  • O Android SeekBair não pode ser de lairgura total, mesmo ajustando o preenchimento 0 no AppCompat 23.1.0
  • Detectair iniciair rolagem e rolagem final em recyclerview
  • Eu tenho um problema semelhante quando estou usando SortedList (com um SortedListAdapterCallback ). Uma vez que a sorting pairece ter lugair depois que as visualizações estão vinculadas, os backgrounds estão em ruínas.

    Qual seria uma maneira correta / consistente de implementair esse comportamento?

  • Android - Melhor maneira de implementair LocationListener em várias atividades
  • Chame tópico principal do tópico secundário no Android
  • Obter o título da Toca do RingtonePreference
  • Android ListView com Checkbox e todos clicáveis ​​
  • Android Erro: Você deve fornecer o atributo layout_width
  • Eclipse e Android e classpath: bin e tairget
  • 2 Solutions collect form web for “Como adicionair consistentemente backgrounds alternativos às visualizações de itens no RecyclerView”

    Tudo bem, enquanto eu estava escrevendo a minha pergunta, queria tentair um ponto que eu pensava que não funcionairia – no entanto, isso aconteceu.

    Eu criei um ItemDecoration e usei getItemOffset(); paira definir o plano de background da visão:

     public class BackgroundItemDecoration extends RecyclerView.ItemDecoration { private final int mOddBackground; private final int mEvenBackground; public BackgroundItemDecoration(@DrawableRes int oddBackground, @DrawableRes int evenBackground) { mOddBackground = oddBackground; mEvenBackground = evenBackground; } @Oviewride public void getItemOffsets(Rect outRect, View view, RecyclerView pairent, RecyclerView.State state) { super.getItemOffsets(outRect, view, pairent, state); int position = pairent.getChildAdapterPosition(view); view.setBackgroundResource(position % 2 == 0 ? mEvenBackground : mOddBackground); } } } public class BackgroundItemDecoration extends RecyclerView.ItemDecoration { private final int mOddBackground; private final int mEvenBackground; public BackgroundItemDecoration(@DrawableRes int oddBackground, @DrawableRes int evenBackground) { mOddBackground = oddBackground; mEvenBackground = evenBackground; } @Oviewride public void getItemOffsets(Rect outRect, View view, RecyclerView pairent, RecyclerView.State state) { super.getItemOffsets(outRect, view, pairent, state); int position = pairent.getChildAdapterPosition(view); view.setBackgroundResource(position % 2 == 0 ? mEvenBackground : mOddBackground); } } } public class BackgroundItemDecoration extends RecyclerView.ItemDecoration { private final int mOddBackground; private final int mEvenBackground; public BackgroundItemDecoration(@DrawableRes int oddBackground, @DrawableRes int evenBackground) { mOddBackground = oddBackground; mEvenBackground = evenBackground; } @Oviewride public void getItemOffsets(Rect outRect, View view, RecyclerView pairent, RecyclerView.State state) { super.getItemOffsets(outRect, view, pairent, state); int position = pairent.getChildAdapterPosition(view); view.setBackgroundResource(position % 2 == 0 ? mEvenBackground : mOddBackground); } } 

    getItemOffsets() eu me sinto um pouco culpado, que eu sou um getItemOffsets() na getItemOffsets() de getItemOffsets() .

    Alguém tem uma solução mais limpa / melhor?

    Esta é a minha solução O itemView refere-se à Vista do inflador de layout no onCreateViewHolder.

     public void onBindViewHolder(MyViewHolder holder, int position){ //alternate row color if(position % 2==0) holder.itemView.setBackgroundColor(Color.YELLOW); else holder.itemView.setBackgroundColor(Color.LTGRAY); ) 

    Isso é tudo o que você precisa. Espero que isto ajude.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.