Reputation: 47
I have KelimeleriGoster.class
. İts holding added word to database. There is recyclerview item in this class.
i want to delete live when i click delete button. İ wanna refresh my list automatically
KelimeleriGoster.class
package com.tcoding.kelimeezberletici;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.tcoding.kelimeezberletici.Adapter.KelimeleriGosterAdapter;
import com.tcoding.kelimeezberletici.KelimeEkle.KelimeEkle;
import com.tcoding.kelimeezberletici.Sınıflar.Kelimeler;
import com.tcoding.kelimeezberletici.Veritabani.Veritabani;
import com.tcoding.kelimeezberletici.Veritabani.VeritabaniDao;
import java.util.ArrayList;
public class KelimeleriGoster extends AppCompatActivity {
private RecyclerView rv;
private FloatingActionButton floatingActionButton;
private ArrayList<Kelimeler> kelimelerArrayList;
private KelimeleriGosterAdapter adapter;
private Veritabani vt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_kelimeleri_goster);
rv = findViewById(R.id.rv);
floatingActionButton = findViewById(R.id.floatingActionButton);
vt = new Veritabani(this);
rv.setHasFixedSize(true);
rv.setLayoutManager(new LinearLayoutManager(this));
kelimelerArrayList = new VeritabaniDao().kelimeleriGoster(vt);
adapter = new KelimeleriGosterAdapter(this,kelimelerArrayList);
rv.setAdapter(adapter);
adapter.notifyDataSetChanged();
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(KelimeleriGoster.this,KelimeEkle.class));
finish();
}
});
}
}
And my Adapter. İts to show to data on recyclerview.. When i click delete button i wanna refresh my word list as live. Like liveData
KelimeleriGosterAdapter.class
package com.tcoding.kelimeezberletici.Adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.tcoding.kelimeezberletici.R;
import com.tcoding.kelimeezberletici.Sınıflar.Kelimeler;
import com.tcoding.kelimeezberletici.Veritabani.Veritabani;
import com.tcoding.kelimeezberletici.Veritabani.VeritabaniDao;
import org.w3c.dom.Text;
import java.util.ArrayList;
public class KelimeleriGosterAdapter extends RecyclerView.Adapter<KelimeleriGosterAdapter.KelimeViewHolder> {
private Context context;
private ArrayList<Kelimeler> kelimelerArrayList;
private Veritabani vt ;
public KelimeleriGosterAdapter(Context context, ArrayList<Kelimeler> kelimelerArrayList) {
this.context = context;
this.kelimelerArrayList = kelimelerArrayList;
}
@NonNull
@Override
public KelimeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardviewdeneme,parent,false);
return new KelimeViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull KelimeViewHolder holder, int position) {
final Kelimeler k = kelimelerArrayList.get(position);
holder.textViewEng.setText(k.getIngilizce());
holder.textViewTr.setText(k.getTurkce());
holder.buttonSil.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vt = new Veritabani(context);
//Sil dedigimizde ogrenilen kelimelere eklenecek o yuzden tanımlamalar yapılmalı
String ingilizce = k.getIngilizce();
String turkce = k.getTurkce();
new VeritabaniDao().bildigimKelimelereEkle(vt,ingilizce,turkce);//For the add another database
// Ekleme yapıldı idsi alınarak silme işlemi yapılmalı(Data Add)
String id = String.valueOf(k.getId());
//to delete data
new VeritabaniDao().sil(vt,id);
}
});
}
@Override
public int getItemCount() {
return kelimelerArrayList.size();
}
public class KelimeViewHolder extends RecyclerView.ViewHolder {
private TextView textViewEng,textViewTr;
private Button buttonSil;
public KelimeViewHolder(@NonNull View itemView) {
super(itemView);
textViewEng = itemView.findViewById(R.id.textViewEng);
textViewTr = itemView.findViewById(R.id.textViewTr);
buttonSil = itemView.findViewById(R.id.buttonSil);
}
}
}
How can i do it
Upvotes: 1
Views: 544
Reputation: 35
You can use diffUtil class for that.Adding diffUtil calls in your adapter class will take care of the animations when you delete something from your list and update the view automatically when you delete an item. Here is an example of how to use diffUtils class in your adapter:
class RunAdapter: RecyclerView.Adapter<RunAdapter.RunViewHolder>() {
inner class RunViewHolder(itemView: View):RecyclerView.ViewHolder(itemView)
private val diffCallBack = object : DiffUtil.ItemCallback<Run>(){
override fun areItemsTheSame(oldItem: Run, newItem: Run): Boolean {
return oldItem.primaryKey == newItem.primaryKey
}
override fun areContentsTheSame(oldItem: Run, newItem: Run): Boolean {
return oldItem.hashCode()==newItem.hashCode()
}
}
private val differ = AsyncListDiffer(this,diffCallBack)
//use this function for submitting your list to adapter class
fun submitList(listRun:List<Run>) = differ.submitList(listRun)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RunViewHolder {
return RunViewHolder(LayoutInflater.from(parent.context).inflate(
R.layout.item_run,
parent,
false
))
}
override fun getItemCount(): Int {
return differ.currentList.size
}
override fun onBindViewHolder(holder: RunViewHolder, position: Int) {
val run = differ.currentList[position]
holder.itemView.apply {
//set your view's here.
}
}
}
Here is an java example,modify it according to your needs:
public class RecyclerViewAdaptar extends ListAdapter<EntityTableNotes, RecyclerViewHolder> {
private RecyclerItemTouchListner mListner;
public RecyclerViewAdaptar() {
super(diffCallBack);
}
private static final DiffUtil.ItemCallback<EntityTableNotes> diffCallBack = new DiffUtil.ItemCallback<EntityTableNotes>() {
@Override
public boolean areItemsTheSame(@NonNull EntityTableNotes oldItem, @NonNull EntityTableNotes newItem) {
return oldItem.getNoteId() == newItem.getNoteId();
}
@Override
public boolean areContentsTheSame(@NonNull EntityTableNotes oldItem, @NonNull EntityTableNotes newItem) {
return oldItem.getNoteTitle().equals(newItem.getNoteTitle()) &&
oldItem.getNoteBody().equals(newItem.getNoteBody()) &&
oldItem.getNotePriority() == newItem.getNotePriority();
}
};
@NonNull
@Override
public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new RecyclerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.singleitemgrid, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull final RecyclerViewHolder holder, final int position) {
holder.noteTitle.setText(getItem(position).getNoteTitle());
}
In activity/fragment use adapter.submitList(yourList) for submitting the data inside adapter.
Upvotes: 0
Reputation: 316
You need to update ur list variable first ( kelimelerArrayList) Then use "notifyItemRemoved(position)" Follow this answer https://stackoverflow.com/a/38000604/3916792
Upvotes: 1