【问题标题】:How to refresh recyclerView when item deleted?删除项目时如何刷新recyclerView?
【发布时间】:2020-09-06 15:05:34
【问题描述】:

我有KelimeleriGoster.class。 İts 持有添加到数据库的单词。这个类有recyclerview项。

我想在单击删除按钮时实时删除。我想自动刷新我的列表

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();
            }
        });

    }



}

还有我的适配器。 İts 显示在 recyclerview 上的数据。当我单击删除按钮时,我想将我的单词列表刷新为实时状态。喜欢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);
        }
    }
}

我该怎么做

【问题讨论】:

    标签: java android database android-studio android-recyclerview


    【解决方案1】:

    你需要先更新你的列表变量(kelimelerArrayList) 然后使用“notifyItemRemoved(position)” 关注这个答案 https://stackoverflow.com/a/38000604/3916792

    【讨论】:

      【解决方案2】:

      您可以为此使用 diffUtil 类。在适配器类中添加 diffUtil 调用将在您从列表中删除某些内容时处理动画,并在您删除项目时自动更新视图。以下是如何在适配器中使用 diffUtils 类的示例:

      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.
              }
      
          }
      }
      

      这是一个java例子,根据你的需要修改:

      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());
      
          }
      

      在activity/fragment中使用adapter.submitList(yourList)来提交adapter内的数据。

      【讨论】:

      • java @samriddha
      • 我也用一个 java 例子编辑了答案。顺便可以使用android studio将kotlin代码转成java代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多