首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView ItemAnimator animateAdd & animateChange同时存在吗?

RecyclerView ItemAnimator animateAdd & animateChange同时存在吗?
EN

Stack Overflow用户
提问于 2016-06-07 01:45:01
回答 1查看 1.4K关注 0票数 1

我正在试着做这个动画:

若要插入新项,其他项将按默认方式下移。但第一项和第二项更改。第一个是使用ViewType 1插入的,然后第二个将ViewType切换为2。我目前管理3种视图类型(adaptadorNotificaciones.java)。

1个完整尺寸。notificacion_item1.xml

2填充。notificacion_item2.xml

3分隔符。section.xml

我对DefaultItemAnimator进行了如下扩展(animadroNotificaciones):

代码语言:javascript
复制
public class animadroNotificaciones extends DefaultItemAnimator {

@Override
public boolean animateAdd(RecyclerView.ViewHolder holder){
    return true;
}

public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY){
    return super.animateChange(oldHolder,newHolder,fromX,fromY,toX,toY);
}

@Override
public void onAnimationFinished(RecyclerView.ViewHolder holder){
    super.onAnimationFinished(holder);
}


@Override
public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY){
    return super.animateMove(holder,fromX,fromY,toX,toY);
}}

我也把它想象成一个堆栈:

代码语言:javascript
复制
LinearLayoutManager llm = new LinearLayoutManager(this);
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    llm.setReverseLayout(true);
    llm.setStackFromEnd(true);
    recyclerView.setLayoutManager(llm);

因此,当我添加一个项目时,滚动条必须向上移动:

代码语言:javascript
复制
recyclerView.scrollToPosition(arreglo.size()-1);

插入项目的完整代码(adaptadorNotificaciones.java):

代码语言:javascript
复制
public void addNotificacion(ItemLista notificacion,RecyclerView recyclerView){
    String mesAnterior = "";
    String mesInsertado = "";

    if(arreglo.size()!=0)
        mesAnterior = ManejadorFechas.getFecha(arreglo.get(arreglo.size()-1).getTiempo(),false);
    mesInsertado = ManejadorFechas.getFecha(notificacion.getTiempo(),false);

    if(!mesInsertado.equals(mesAnterior) && arreglo.size()!=0){

        arreglo.get(arreglo.size()-1).setTipo(2);
        arreglo.add(new ItemLista(3,mesAnterior));
        arreglo.add(notificacion);

        notifyItemRangeChanged(arreglo.size()-3,arreglo.size()-1);
        recyclerView.scrollToPosition(arreglo.size()-1);

    }else if(arreglo.size()!=0){
        arreglo.get(arreglo.size()-1).setTipo(2);
        arreglo.add(notificacion);
        notifyItemRangeChanged(arreglo.size()-2,arreglo.size()-1);
        recyclerView.scrollToPosition(arreglo.size()-1);
    }else{
        arreglo.add(notificacion);
        notifyItemInserted(arreglo.size()-1);
        recyclerView.scrollToPosition(arreglo.size()-1);
    }
}

但是上面的代码给了我下一个结果:

我认为这是由下面这句话引起的:

代码语言:javascript
复制
notifyItemRangeChanged(arreglo.size()-3,arreglo.size()-1);

有谁知道怎么解决这个问题吗?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-06-17 04:12:37

我这样解决了这个问题:

代码语言:javascript
复制
rv.setItemAnimator(new animadroNotificaciones(){
            @Override
            public void onAnimationFinished(RecyclerView.ViewHolder viewHolder) {
                adaptador.notifyDataSetChanged();
            }
        });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37663740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档