简体   繁体   中英

Android swipe to delete recyclerView items

I can delete my recyclerView items and from firebase realtime database too. But when i swipe the item and deleted, the top recycler item comes to the position of recyclerview that I deleted. How can i fix that?

My Source Code: I am trying to swipe and delete recycler item right here.

private Toolbar toolbar;
public DatabaseReference duyuruRef;
public RecyclerView recyclerView;
ArrayList<Duyuru> duyurular;
RecyclerAdapter recyclerAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ogretmen_duyuru_delete);

    recyclerView = findViewById(R.id.recyclerDelete);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    duyuruRef = FirebaseDatabase.getInstance().getReference();
    duyuruRef.keepSynced(true);
    duyurular = new ArrayList<>();

    getDataFromFirebase();
    setUpToolbar();

    ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder target, int i) {
            Duyuru duyuru = new Duyuru();
            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
            DatabaseReference duyuruRef = rootRef.child("Duyuru");
            String pid = duyuru.getPid();
            int position = target.getAdapterPosition();
            duyuruRef.child(pid).removeValue();
            duyurular.remove(position);
            recyclerAdapter.notifyDataSetChanged();
        }
    });
    helper.attachToRecyclerView(recyclerView);
}

private void getDataFromFirebase() {
    Query query = duyuruRef.child("Duyuru");
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
                Duyuru duyuru = new Duyuru();
                duyuru.setDuyuruBaslik(snapshot.child("title").getValue().toString());
                duyuru.setDuyuruContext(snapshot.child("context").getValue().toString());
                duyuru.setDuyuruTime(snapshot.child("time").getValue().toString());
                duyuru.setDuyuruDate(snapshot.child("date").getValue().toString());
                duyuru.setDuyuruYazar(snapshot.child("yazar").getValue().toString());

                duyurular.add(duyuru);
            }
            recyclerAdapter = new RecyclerAdapter(getApplicationContext(),duyurular);
            recyclerView.setAdapter(recyclerAdapter);
            recyclerAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

If you want my RecyclerAdapter it is here:

private Context mContext;
private ArrayList<Duyuru> duyuruArrayList;

public RecyclerAdapter(Context mContext, ArrayList<Duyuru> duyuruArrayList) {
    this.mContext = mContext;
    this.duyuruArrayList = duyuruArrayList;
}

@NonNull
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.duyuru_items_layout,parent,false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    holder.txtBaslik.setText(duyuruArrayList.get(position).getDuyuruBaslik());
    holder.txtContext.setText(duyuruArrayList.get(position).getDuyuruContext());
    holder.txtYazar.setText(duyuruArrayList.get(position).getDuyuruYazar());
    holder.txtTime.setText(duyuruArrayList.get(position).getDuyuruTime());
    holder.txtDate.setText(duyuruArrayList.get(position).getDuyuruDate());

    holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mContext, activity_duyuru_update_screen.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("baslik",duyuruArrayList.get(position).getDuyuruBaslik());
            intent.putExtra("context",duyuruArrayList.get(position).getDuyuruContext());
            intent.putExtra("yazar",duyuruArrayList.get(position).getDuyuruYazar());
            intent.putExtra("time",duyuruArrayList.get(position).getDuyuruTime());
            intent.putExtra("date",duyuruArrayList.get(position).getDuyuruDate());
            intent.putExtra("pid",duyuruArrayList.get(position).getPid());
            mContext.startActivity(intent);
        }
    });
}

@Override
public int getItemCount() {
    return duyuruArrayList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    TextView txtBaslik,txtContext,txtYazar,txtTime,txtDate;
    RelativeLayout parentLayout;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        txtBaslik = itemView.findViewById(R.id.ac_cv_duyuru_baslik);
        txtContext = itemView.findViewById(R.id.ac_cv_duyuru_context);
        txtTime = itemView.findViewById(R.id.ac_cv_duyuru_time);
        txtYazar = itemView.findViewById(R.id.ac_cv_duyuru_yazar);
        txtDate = itemView.findViewById(R.id.ac_cv_duyuru_date);
        parentLayout = itemView.findViewById(R.id.ac_items_layout);
    }
}

Use ItemTouchHelper class

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(newItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT|ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
           return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
              notifyItemRemoved(getAdapterPosition());
              notifyItemRangeChanged(getAdapterPosition(), MainActivity.arrList.size());

        }
    });

    itemTouchHelper.attachToRecyclerView(recyclerView);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM