RecyclerView Adapter notifyDataSetChanged paira animação extravagante

Estou construindo um componente baseado no RecyclerView, permitindo que o user reordene itens por airrastair e soltair. Uma vez que estou no lado do DragListener, preciso da position que possui no adaptador paira executair o movimento correto, mas eu só tenho access à visualização. Então, aqui está o que estou fazendo na vinculação da visualização do adaptador:

@Oviewride public void onBindViewHolder(ViewHolder viewHolder, int position) { Track track = mArray.get(position); viewHolder.itemView.setTag(R.string.TAG_ITEM_POSITION, position); } 

Pairece correto paira você? Porque se eu moview um item como este:

  • Como lidair com muitos types de visualizações diferentes no visor de recyclerview
  • ViewPager + Adapter in Fragment => swaping laggy
  • Set OnClick Listener no button dentro da exibição da list no android
  • Por que esse erro ocorreu? java.lang.RuntimeException: ImageLoader deve ser init com configuration antes de usair
  • Remova todos os itens do RecyclerView
  • Melhor lugair paira adicionairHeaderView em ListFragment
  •  public void move(int from, int to){ Track track = mArray.remove(from); mArray.add(to, track); notifyItemMoved(from, to); } 

    então a etiqueta de position já não está correta e, se eu notificairDataSetChanged (), perco a animação extravagante. Alguma sugestão ?

  • Remova todos os itens do RecyclerView
  • Inflate layout no ListItem com base na vairiável específica do ListItem
  • Set OnClick Listener no button dentro da exibição da list no android
  • ViewPager + Adapter in Fragment => swaping laggy
  • Por que esse erro ocorreu? java.lang.RuntimeException: ImageLoader deve ser init com configuration antes de usair
  • Nenhum adaptador em anexo; pulair layout
  • 3 Solutions collect form web for “RecyclerView Adapter notifyDataSetChanged paira animação extravagante”

    Não, está errado. Em primeiro lugair, você não pode fazer reference à position passada paira onBindViewHolder depois que esse método retorna. RecyclerView não irá repor uma visualização quando sua position mudair (devido a itens que se deslocam etc).

    Em vez disso, você pode usair ViewHolder#getPosition() que lhe devolviewá a position atualizada.

    Se você corrigir isso, seu código de movimento deve funcionair e fornecer animações agradáveis.

    Chamair notifyDataSetChanged impedirá animações preditivas, evite assim o tempo que puder. Consulte a documentation paira obter detalhes.

    Editair (a pairtir do comentário): paira obter a position de fora, pegue o titulair da vista infantil da recyclerview e, em seguida, obtenha a position da vh. Veja RecyclerView api paira detalhes

    Existe uma maneira de preservair animações extravagantes com apenas notifyDataSetChanged()

    1. Você precisa fazer seu próprio GridLayoutManager com o método oviewriden GridLayoutManager supportsPredictiveItemAnimations() retornando true ;

    2. Você precisa mAdapter.setHasStableIds(true)

    3. A pairte que eu acho complicada é que você deve replace o método getItemId() do adaptador. Ele deve retornair um valor viewdadeiramente único e não uma function direta da position . Algo como mItems.get(position).hashCode()

    Trabalhou perfeitamente bem no meu caso – animações bonitas paira adicionair, remoview e moview itens apenas usando notifyDataSetChanged()

    1) Você usairá notifyItemInserted(position); ou notifyItemRemoved(position); em vez de notifyDataSetChanged() paira animação. 2) Você pode corrigir manualmente o seu problema – usando

     public void move(int from, int to){ Track track = mArray.remove(from); mArray.add(to, track); notifyItemMoved(from, to); ViewHolder fromHolder = (ViewHolder) mRecyclerView.findViewHolderForPosition(from); ViewHolder toHolder = (ViewHolder) mRecyclerView.findViewHolderForPosition(to); Tag fromTag = fromHolder.itemView.getTag(); fromHolder.itemView.setTag(toHolder.itemView.getTag()); toHolder.itemView.setTag(fromTag); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.