web-dev-qa-db-fra.com

Comment glisser pour supprimer sur RecyclerView?

Ce que j'ai ici une page d'historique qui affiche les demandes que l'utilisateur a acceptées ou postées. J'ai pu mettre avec succès un bouton permettant à l'utilisateur de supprimer tout l'historique de l'utilisateur. Maintenant, je veux que l'utilisateur puisse effacer un historique un par un en le glissant.

HistoireFragment.Java

RecyclerView rView;
Button clear;
DatabaseReference dRef;
LinearLayoutManager llm;
String id;

View myView;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    myView = inflater.inflate(R.layout.history, container, false);

    FirebaseUser fu = FirebaseAuth.getInstance().getCurrentUser();
    id = fu.getUid();
    dRef = FirebaseDatabase.getInstance().getReference().child("History"+id);
    clear = (Button) myView.findViewById(R.id.clear);
    rView = (RecyclerView) myView.findViewById(R.id.history_list);
    rView.setHasFixedSize(true);
    llm = new LinearLayoutManager(getActivity());
    llm.setReverseLayout(true);
    llm.setStackFromEnd(true);
    rView.setLayoutManager(llm);

    clear.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dRef.removeValue();
        }
    });

    return myView;
}
@Override
public void onStart() {
    super.onStart();
    FirebaseRecyclerAdapter<HistoryData, HistoryFragment.RequestViewHolder> fra = new FirebaseRecyclerAdapter<HistoryData, HistoryFragment.RequestViewHolder>(
            HistoryData.class,
            R.layout.historylistview,
            HistoryFragment.RequestViewHolder.class,
            dRef
    ) {
        @Override
        protected void populateViewHolder(final HistoryFragment.RequestViewHolder viewHolder, HistoryData model, final int position) {

            viewHolder.setTrans(model.getTrans());
            viewHolder.setRequestDeadline(model.getRequestDeadline());
            viewHolder.setRequestDescription(model.getRequestDescription());
            viewHolder.setDateTimeAccepted(model.getDateTimeAccepted());
            viewHolder.setRequestLocation(model.getRequestLocation());
            viewHolder.setProfile(getApplicationContext() ,model.getProfile());

        }

    };
    rView.setAdapter(fra);
}
public static class RequestViewHolder extends RecyclerView.ViewHolder{
    View myView;

    public RequestViewHolder(View itemView) {
        super(itemView);

        myView = itemView;
    }
    public void setTrans(String profile){
        TextView trans = (TextView) myView.findViewById(R.id.transaction);
        trans.setText(profile);
    }
    public void setRequestDeadline(String dead){
        TextView rdead = (TextView) myView.findViewById(R.id.rDead);
        rdead.setText(dead);
    }
    public void setRequestDescription(String desc){
        TextView rdesc = (TextView) myView.findViewById(R.id.rDesc);
        rdesc.setText(desc);
    }
    public void setDateTimeAccepted(String date){
        TextView dta = (TextView) myView.findViewById(R.id.rAccept);
        dta.setText(date);
    }
    public void setRequestLocation(String loc){
        TextView rloc = (TextView) myView.findViewById(R.id.rLoc);
        rloc.setText(loc);
    }
    public void setProfile(Context c, String profile){
        ImageView rprofile = (ImageView) myView.findViewById(R.id.HPicture);
        Picasso.with(c).load(profile).into(rprofile);
    }
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
}

Je n'ai pas vraiment essayé rien parce que les autres questions que j'ai vues jusqu'ici ne semblent pas être semblables à mes codes.

5
exc3m

C'est assez simple et vous pouvez le faire sans utiliser aucune bibliothèque tierce.

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

Et maintenant le rappel,

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.DOWN | ItemTouchHelper.UP) {

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            Toast.makeText(MyActivity.this, "on Move", Toast.LENGTH_SHORT).show();
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            Toast.makeText(MyActivity.this, "on Swiped ", Toast.LENGTH_SHORT).show();
            //Remove swiped item from list and notify the RecyclerView
            final int position = viewHolder.getAdapterPosition();
            adapter.notifyItemRemoved(position);
        }
 };

Vous pouvez maintenant identifier lequel de vos articles a été glissé. Vous pouvez supprimer l'élément de votre adaptateur et notifyDataSetChanged().

11
Aritra Roy

Vous devrez utiliser une bibliothèque/un widget existant, sauf si vous souhaitez créer la fonctionnalité à partir de rien. 

Par exemple: 

https://Android-arsenal.com/details/1/4897

Vous avez des instructions complètes mais fondamentalement:

mRecyclerView = new CdsRecyclerView(this);
mRecyclerView = (CdsRecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

// Adapter:

mRecyclerViewAdapter = new RecyclerViewAdapter(this, getData());
mRecyclerView.setAdapter(mRecyclerViewAdapter);

// Enable swipe: 

mRecyclerView.enableItemSwipe();

// Listener:

mRecyclerView.setItemSwipeCompleteListener(new CdsItemTouchCallback.ItemSwipeCompleteListener() {
      @Override
      public void onItemSwipeComplete(int position) {
          Toast.makeText(MainActivity.this, "Item was swiped:" + position,
                  Toast.LENGTH_SHORT).show();
      }
  });
1
SuppressWarnings