Java 使用firebase拖放recyclerView

Java 使用firebase拖放recyclerView,java,android,firebase,Java,Android,Firebase,我正在尝试在使用FirebaseRecyclerAdapter的recyclerView中实现拖放功能。我在firebase child中有一个属性,用于存储其订单位置,并对我发现的数据进行重新排序,如下所示: @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { f

我正在尝试在使用FirebaseRecyclerAdapter的recyclerView中实现拖放功能。我在firebase child中有一个属性,用于存储其订单位置,并对我发现的数据进行重新排序,如下所示:

  @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        final int firstPosition = viewHolder.getAdapterPosition();;
        final int secondPosition = target.getAdapterPosition();
        DatabaseReference firstItemRef = fireBaseRvAdapter.getRef(viewHolder.getAdapterPosition());
        DatabaseReference secondItemRef = fireBaseRvAdapter.getRef(target.getAdapterPosition());

        HashMap<String, Object> updateFirstItemOrderNumber = new HashMap<>();
        updateFirstItemOrderNumber.put(FBdatabase.FIELD_ORDER, secondPosition);
        firstItemRef.updateChildren(updateFirstItemOrderNumber);

        HashMap<String, Object> updateSecondItemOrderNumber = new HashMap<>();
        updateSecondItemOrderNumber.put(FBdatabase.FIELD_ORDER, firstPosition);
        secondItemRef.updateChildren(updateSecondItemOrderNumber);

        return false;
    }
@覆盖
公共布尔onMove(RecyclerView RecyclerView、RecyclerView.ViewHolder ViewHolder、RecyclerView.ViewHolder目标){
final int firstPosition=viewHolder.getAdapterPosition();;
final int secondPosition=target.getAdapterPosition();
DatabaseReference firstItemRef=FirebaserAdapter.getRef(viewHolder.getAdapterPosition());
DatabaseReference secondItemRef=FirebaserAdapter.getRef(target.getAdapterPosition());
HashMap updateFirstItemOrderNumber=新HashMap();
updateFirstItemOrderNumber.put(FBdatabase.FIELD_ORDER,secondPosition);
firstItemRef.updateChildren(UpdateFirstItemMorderNumber);
HashMap updateSecondItemOrderNumber=新HashMap();
updateSecondItemOrderNumber.put(FBdatabase.FIELD\u ORDER,firstPosition);
secondItemRef.updateChildren(updateSecondItemOrderNumber);
返回false;
}

但拖动在第一次交换后会自动停止,然后列表会奇怪地显示动画。它按顺序进行更改,但看起来不太好。

我将添加一些解释,但稍后。。。(再次)

在活动中初始化recyclerView:

 recycleListView = (RecyclerView) findViewById(R.id.list);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recycleListView.setLayoutManager(layoutManager);
        DefaultItemAnimator an = new DefaultItemAnimator();
        recycleListView.setItemAnimator(an);

        //Firebase
        fb = new FBdatabase(); //Some firebase initialization here

        fireBaseRvAdapter = new CustomFirebaseAdapter(
                Record.class,
                R.layout.list_item,
                MyFireBaseRvAdapter.RecordViewHolderIns.class,
                fb.getRef().orderByChild(FBdatabase.FIELD_ORDER)
        );
        fireBaseRvAdapter.setOnItemClickListener(this);
        recycleListView.setAdapter(fireBaseRvAdapter);

        //Firebase

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
        itemTouchHelper.attachToRecyclerView(recycleListView);

你找到解决这个问题的方法了吗?我写了自己的适配器,这就是我所能说的。我现在无法发布代码,也许以后会发布。谢谢,@Evgeniy,我会尝试找出代码中的工作原理。
  ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(
            ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

        @Override
        public boolean isItemViewSwipeEnabled() {
            return false;
        }

        @Override
        public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
            super.onSelectedChanged(viewHolder, actionState);
            if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
                fireBaseRvAdapter.onStartDragging();
            } else if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) {

            }
        }

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            final int firstPosition = viewHolder.getAdapterPosition();
            final int secondPosition = target.getAdapterPosition();
            DatabaseReference firstItemRef = fireBaseRvAdapter.getRef(viewHolder.getAdapterPosition());
            DatabaseReference secondItemRef = fireBaseRvAdapter.getRef(target.getAdapterPosition());

            firstItemRef.child(FBdatabase.FIELD_ORDER).setValue(secondPosition);

            secondItemRef.child(FBdatabase.FIELD_ORDER).setValue(firstPosition);

            fireBaseRvAdapter.onItemMoved(firstPosition, secondPosition);
            return true;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

        }

        @Override
        public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            super.clearView(recyclerView, viewHolder);
            fireBaseRvAdapter.onStopDragging();

        }
    };
 recycleListView = (RecyclerView) findViewById(R.id.list);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recycleListView.setLayoutManager(layoutManager);
        DefaultItemAnimator an = new DefaultItemAnimator();
        recycleListView.setItemAnimator(an);

        //Firebase
        fb = new FBdatabase(); //Some firebase initialization here

        fireBaseRvAdapter = new CustomFirebaseAdapter(
                Record.class,
                R.layout.list_item,
                MyFireBaseRvAdapter.RecordViewHolderIns.class,
                fb.getRef().orderByChild(FBdatabase.FIELD_ORDER)
        );
        fireBaseRvAdapter.setOnItemClickListener(this);
        recycleListView.setAdapter(fireBaseRvAdapter);

        //Firebase

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
        itemTouchHelper.attachToRecyclerView(recycleListView);