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