2

左のスワイプでFirebaseからオブジェクトを削除したいとします。スワイプですべてうまく動作し、ビューから削除されましたが、データベースに残ります。スワイプでFirebaseオブジェクトを削除する

私は自分のonCreateに以下を追加しました:

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) { 

    @Override 
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
     return false; 
    } 

    @Override 
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
     Toast.makeText(ListBox.this, "Item removed", Toast.LENGTH_SHORT).show(); 
     //Remove swiped item from list and notify the RecyclerView 
    } 
}; 

、これは私が私のViewHolderを移入する方法です。

@Override 
     protected void populateViewHolder(final BoxViewHolder viewHolder, final Box model, int position) { 

      viewHolder.setTitle(model.getTitle()); 
      final String boxUniqueKey = model.getBoxkey(); 

      final DatabaseReference postRef = getRef(position); 
      final String postKey = postRef.getKey(); 

      viewHolder.itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        // Launch BoxItem view 
        final Intent intent = new Intent(ListBox.this, AddBoxItem.class); 

        String boxkey = model.getBoxkey(); 
        String boxName = model.getTitle(); 

        startActivity(intent); 

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
        itemTouchHelper.attachToRecyclerView(allBoxes); 

       } 
      }); 
     } 

ただし、アイテムの位置はどのように取得できますか、削除クエリをFirebaseデータベースに送信するにはどうすればよいですか。

+0

あなたは 'onSwipe'内の' BoxViewHolder'を与えることができます。しかし、あなたは、BoxViewHolderの一部として格納されたデータのIDまたは位置を必要とします –

答えて

1

私はあなたが達成しようとしているものに非常に類似したものをコーディングしています。これはあなたがそれを達成するための一つの方法です。最初にItemTouchHelpet.SimpleCallbackクラスを拡張して独自のカスタムクラスを作成します。 viewHolder.getAdapterPosition()を呼び出す

public class CallBack extends ItemTouchHelper.SimpleCallback { 


private RecyclerAdapter adapter; // this will be your recycler adapter 

private DatabaseReference root = FirebaseDatabase.getInstance().getReference(); 



/** 
* 
    Make sure you pass in your RecyclerAdapter to this class 

*/ 
public CallBack(int dragDirs, int swipeDirs, RecyclerAdapter adapter) { 
    super(dragDirs, swipeDirs); 
    this.adapter = adapter; 
} 

@Override 
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
    return false; 
} 

@Override 
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
    int position = viewHolder.getAdapterPosition(); // this is how you can get the position 
    Object object = adapter.getObject(position); // You will have your own class ofcourse. 

    // then you can delete the object 
    root.child("Object").child(object.getId()).setValue(null);// setting the value to null will just delete it from the database. 

} 

アダプターのビューの位置を返します。この位置を使用して、リサイクラーアダプターに含まれるArrayListからObjectを取得できます。

私のアダプタでは、getObjectメソッドを作成しました。これは、アダプタが持っているArrayListからオブジェクトを返します。オブジェクトを取得したら、Firebaseを呼び出してオブジェクトを削除できます。私のオブジェクトクラスでは、オブジェクト内にユニークキーを保存していますので、簡単に削除できます。 getId()を呼び出すことによって一意のIDを取得します。私はこれをFirebaseに渡し、値をnullに設定し、これを削除します。

これを実行した後、このようにリサイクラービューに追加できます。

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new 
      CallBack(0, ItemTouchHelper.RIGHT, choreRecyclerAdapter, getContext()); // Making the SimpleCallback 

    ItemTouchHelper touchHelper = new ItemTouchHelper(simpleItemTouchCallback); 

    touchHelper.attachToRecyclerView(recyclerView); // then attatch it to your recycler view 

まず、単純なコールバックを行い、拡張したカスタムクラスをインスタンス化することを確認します。リサイクラーアダプターを必ず渡してください。 Notice私は、ItemTouchHelper.Rightを渡すことによって、右のスワイプしかサポートしません。左または右の両方をサポートすることができます。その後、ItemTouchHelperオブジェクトを作成し、単純なコールバックに渡します。次に、あなたのリサイクラーのビューにあなたのタッチヘルパーを添付して、それはすべてです。

+0

ありがとう!これはまさに私が望んでいたものです! –

関連する問題