繁体   English   中英

从房间数据库中删除问题

[英]Deleting issue from Room Database

我从应用程序中删除项目时遇到问题。 它实际上是一个笔记应用程序,我在其中创建了一个删除笔记的 AlertDialog function。 这是我的 function 的代码

 private void showDeleteDialog(int position) {
        AlertDialog.Builder alert = new AlertDialog.Builder(context)
                .setTitle("Delete view")
                .setMessage("Are you sure to delete")
                .setIcon(R.drawable.ic_baseline_delete_24)
                .setPositiveButton("yes", (dialogInterface, i) -> databaseHelper.notesDao().deleteNotes(new Notes(arrNotes.get(position).id, arrNotes.get(position).title, arrNotes.get(position).text)))
                .setNegativeButton("No", (dialogInterface, i) -> {

                });
        alert.show();
    }

这里我称之为

        holder.llView.setOnLongClickListener(view -> {
            showDeleteDialog(position);
            return true;
        });

当我单击“是”时,应用程序崩溃了,但它成功地从数据库中删除了笔记。这是我得到的错误

    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{a4d7d56 position=1 id=-1, oldPos=0, pLpos:0 scrap [attachedScrap] tmpDetached no parent} androidx.recyclerview.widget.RecyclerView{815f028 VFED..... ......I. 31,171-689,776 #7f090165 app:id/recycler_view}, adapter:com.example.keepnotes.RecyclerViewAdapter@773a141, layout:androidx.recyclerview.widget.StaggeredGridLayoutManager@a3a6e6, context:com.example.keepnotes.MainActivity@3065e55

所有这些都在 RecyclerView 适配器中。 recyclerView 适配器的代码如下

package com.example.keepnotes;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    Context context;
    ArrayList<Notes> arrNotes;
    DatabaseHelper databaseHelper;
    private RecyclerView.RecyclerListener listener;

    RecyclerViewAdapter(Context context, ArrayList<Notes> arrNotes, DatabaseHelper databaseHelper) {
        this.context = context;
        this.arrNotes = arrNotes;
        this.databaseHelper = databaseHelper;
    }

    public RecyclerViewAdapter(ArrayList<Notes> arrNotes, RecyclerView.RecyclerListener listener) {
        this.arrNotes = arrNotes;
        this.listener = listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.single_view, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        holder.title.setText(arrNotes.get(position).title);
        holder.body.setText(arrNotes.get(position).text);
        holder.index.setText(String.valueOf(position + 1));


        holder.llView.setOnClickListener(view -> {
            Intent iNext = new Intent(context, ViewActivity.class);
            iNext.putExtra("title", arrNotes.get(position).title);
            iNext.putExtra("text", arrNotes.get(position).text);
            context.startActivity(iNext);
        });

        holder.llView.setOnLongClickListener(view -> {
            showDeleteDialog(position);
            return true;
        });


    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView title, body, index;
        CardView llView;

        public ViewHolder(View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.text_title_view);
            body = itemView.findViewById(R.id.text_text_view);
            index = itemView.findViewById(R.id.index);
            llView = itemView.findViewById(R.id.card_View);
            databaseHelper = DatabaseHelper.getDatabase(context);
        }
    }

    private void showDeleteDialog(int position) {
        AlertDialog.Builder alert = new AlertDialog.Builder(context)
                .setTitle("Delete view")
                .setMessage("Are you sure to delete")
                .setIcon(R.drawable.ic_baseline_delete_24)
                .setPositiveButton("yes", (dialogInterface, i) -> databaseHelper.notesDao().deleteNotes(new Notes(arrNotes.get(position).id, arrNotes.get(position).title, arrNotes.get(position).text)))
                .setNegativeButton("No", (dialogInterface, i) -> {

                });
        alert.show();
    }
}


我怎样才能摆脱这个错误????

它已解决,实际上,在 Live Data 中,我使用的是 notifyiteminserted,我将其更改为 notifyDataSetChnaged。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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