簡體   English   中英

刪除項目時如何刷新recyclerView?

[英]How to refresh recyclerView when item deleted?

我有KelimeleriGoster.class 將添加的單詞添加到數據庫中。 這個類中有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();
            }
        });

    }



}

還有我的適配器。 要在 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);
        }
    }
}

我該怎么做

你需要先更新你的列表變量(kelimelerArrayList)然后使用“notifyItemRemoved(position)”按照這個答案https://stackoverflow.com/a/38000604/3916792

您可以為此使用 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());

    }

在活動/片段中使用 adapter.submitList(yourList) 提交適配器內的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM