Solution 1 :
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);
Problem :
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);
}
}
Comments
Comment posted by Alex Mamo
Please show us a concrete example of that behaviour.
READ [FIXED] android - Are snapshot images identical on devices with different physical dimensions but with the same pixel dimensions and same dpi
Powered by Inline Related Posts
Comment posted by Pablusha
I showed already look at the ItemTouchHelper class in the activity and RecyclerAdapter onBindViewHolder
Comment posted by Robert Page
oh sorry, I didn’t see that. You can use notifyItemRemoved(getAdapterPosition()); notifyItemRangeChanged(getAdapterPosition(),MainActivity.arrList.size());