Android 从recyclerView单击中正确删除sqlite条目

Android 从recyclerView单击中正确删除sqlite条目,android,android-recyclerview,android-sqlite,Android,Android Recyclerview,Android Sqlite,我的应用程序在SQLite数据库中存储名称和结果,并在RecycleViewer中显示。以前我使用的是一个列表视图,在这里,我可以通过LongClick删除类似于此处的项目 现在我已经切换到recyclerView,我无法正确处理它。当我删除它时,它会消失,但当我重新加载片段时,删除的条目会再次出现。我假设它是因为该项仅从适配器中的列表中删除,但是如何从实际调用recylerViewer的片段中的列表中删除它呢 这是我的适配器: 公共类DatabaseAdapter扩展了RecyclerView

我的应用程序在SQLite数据库中存储名称和结果,并在RecycleViewer中显示。以前我使用的是一个列表视图,在这里,我可以通过LongClick删除类似于此处的项目 现在我已经切换到recyclerView,我无法正确处理它。当我删除它时,它会消失,但当我重新加载片段时,删除的条目会再次出现。我假设它是因为该项仅从适配器中的列表中删除,但是如何从实际调用recylerViewer的片段中的列表中删除它呢

这是我的适配器:

公共类DatabaseAdapter扩展了RecyclerView.Adapter{ 列出dataModelArrayList; 语境

public DatabaseAdapter(List<DataModel> dataModelArrayList, Context context) {
    this.dataModelArrayList = dataModelArrayList;
    this.context = context;
}

class Myholder extends RecyclerView.ViewHolder implements CardView.OnLongClickListener {
    TextView name, result;


    public Myholder(View itemView) {
        super(itemView);

        name = (TextView) itemView.findViewById(R.id.card_name);
        result = (TextView) itemView.findViewById(R.id.card_result);
        CardView cardView = (CardView) itemView.findViewById(R.id.card_view);
        cardView.setOnLongClickListener(this);
    }

    @Override
    public boolean onLongClick(View v) {
        new AlertDialog.Builder(context)
                .setIcon(R.drawable.ic_warning_black_24dp)
                .setTitle("Delete result")
                .setMessage("Are you sure you want delete this result?")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        /* This is where deletions should be handled */
                        int id = getAdapterPosition();
                        DataBHelper database = new DataBHelper(context);
                        database.deleteEntry(id);
                        dataModelArrayList.remove(id);
                        notifyItemRemoved(id);
                        notifyDataSetChanged();
                        database.close();
                    }

                })
                .setNegativeButton("No", null)
                .show();
        return true;
    }
}

@Override
public Myholder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, null);
    return new Myholder(view);

}

@Override
public void onBindViewHolder(Myholder holder, int position) {
    DataModel dataModel = dataModelArrayList.get(position);
    holder.name.setText(dataModel.getName());
    holder.result.setText(dataModel.getResult());
}

@Override
public int getItemCount() {
    return dataModelArrayList.size();
}}
公共数据库适配器(列出dataModelArrayList,上下文){ this.dataModelArrayList=dataModelArrayList; this.context=上下文; } 类Myholder扩展了RecyclerView.ViewHolder实现了CardView.OnLongClickListener{ 文本视图名称、结果; 公共Myholder(查看项目视图){ 超级(项目视图); name=(TextView)itemView.findViewById(R.id.card\u name); 结果=(TextView)itemView.findViewById(R.id.card\u结果); cardwiew cardwiew=(cardwiew)itemView.findviewbyd(R.id.card\u视图); 设置OnLongClickListener(此); } @凌驾 仅长按公共布尔值(视图v){ 新建AlertDialog.Builder(上下文) .setIcon(右可绘制ic警告黑色24dp) .setTitle(“删除结果”) .setMessage(“确实要删除此结果吗?”) .setPositiveButton(“是”,新的DialogInterface.OnClickListener(){ @凌驾 public void onClick(DialogInterface dialog,int which){ /*这就是应该处理删除的地方*/ int id=getAdapterPosition(); DataHelper数据库=新的DataHelper(上下文); deleteEntry(id); dataModelArrayList.remove(id); 已删除的项目(id); notifyDataSetChanged(); close()数据库; } }) .setNegativeButton(“否”,null) .show(); 返回true; } } @凌驾 public Myholder onCreateViewHolder(视图组父级,int-viewType){ View=LayoutInflater.from(parent.getContext()).flate(R.layout.row,null); 返回新的Myholder(视图); } @凌驾 公共无效onBindViewHolder(Myholder,int位置){ DataModel DataModel=dataModelArrayList.get(位置); holder.name.setText(dataModel.getName()); result.setText(dataModel.getResult()); } @凌驾 public int getItemCount(){ 返回dataModelArrayList.size(); }} 这是:

public class DataBHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
public static final String DATABASE_NAME = "results_database";
public static final String RESULTS_TABLE_NAME = "results_table";
public static final String RESULTS_COLUMN_ID = "_id";
public static final String RESULTS_COLUMN_NAME = "name";
public static final String RESULTS_COLUMN_RESULT = "result";

public DataBHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL("CREATE TABLE " + RESULTS_TABLE_NAME + " (" +
            RESULTS_COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            RESULTS_COLUMN_NAME + " TEXT, " +
            RESULTS_COLUMN_RESULT + " TEXT" + ")");
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + RESULTS_TABLE_NAME);
    onCreate(sqLiteDatabase);
}

public void saveToDB(String fname, String lname, String result) {
    SQLiteDatabase database = getWritableDatabase();
    ContentValues values = new ContentValues();
    String name = fname + " " + lname;
    values.put(DataBHelper.RESULTS_COLUMN_NAME, name);
    values.put(DataBHelper.RESULTS_COLUMN_RESULT, result);
    database.insert(DataBHelper.RESULTS_TABLE_NAME, null, values);
    database.close();
}

public List<DataModel> readDB(){
    List<DataModel> data=new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * from "+RESULTS_TABLE_NAME+" ;",null);
    StringBuffer stringBuffer = new StringBuffer();
    DataModel dataModel = null;
    while (cursor.moveToNext()) {
        dataModel= new DataModel();
        String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
        String result = cursor.getString(cursor.getColumnIndexOrThrow("result"));
        dataModel.setName(name);
        dataModel.setResult(result);
        stringBuffer.append(dataModel);
        data.add(dataModel);
    }
    return data;
}

public void clearDatabase() {
    SQLiteDatabase sqLiteDatabase = getWritableDatabase();
    String clearDBQuery = "DELETE FROM "+RESULTS_TABLE_NAME;
    sqLiteDatabase.execSQL(clearDBQuery);
}

public void deleteEntry(long row) {
    SQLiteDatabase sqLiteDatabase = getWritableDatabase();
    sqLiteDatabase.delete(RESULTS_TABLE_NAME, RESULTS_COLUMN_ID + "=" + row, null);
}}
公共类DataBHelper扩展了SQLiteOpenHelper{
私有静态最终int数据库_VERSION=2;
公共静态最终字符串数据库\u NAME=“结果\u数据库”;
公共静态最终字符串RESULTS\u TABLE\u NAME=“RESULTS\u TABLE”;
公共静态最终字符串结果\u列\u ID=“\u ID”;
公共静态最终字符串结果\u列\u NAME=“NAME”;
公共静态最终字符串结果\u列\u RESULT=“RESULT”;
公共数据助手(上下文){
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase SQLiteDatabase){
execSQL(“创建表”+结果表名称+”(“+
结果\u列\u ID+“整数主键自动递增,”+
结果\u列\u名称+“文本,”+
结果列(结果+“文本+”);
}
@凌驾
public void onUpgrade(SQLiteDatabase SQLiteDatabase,inti,inti1){
execSQL(“如果存在删除表”+结果表名称);
onCreate(sqLiteDatabase);
}
public void saveToDB(字符串fname、字符串lname、字符串结果){
SQLiteDatabase=getWritableDatabase();
ContentValues=新的ContentValues();
字符串名称=fname+“”+lname;
value.put(datahelper.RESULTS\u COLUMN\u NAME,NAME);
value.put(datahelper.RESULTS\u COLUMN\u RESULT,RESULT);
database.insert(datahelper.RESULTS\u TABLE\u NAME,null,value);
close()数据库;
}
公共列表readDB(){
列表数据=新的ArrayList();
SQLiteDatabase db=this.getReadableDatabase();
Cursor Cursor=db.rawQuery(“选择*自”+结果\表格\名称+”;”,空);
StringBuffer StringBuffer=新的StringBuffer();
DataModel DataModel=null;
while(cursor.moveToNext()){
dataModel=新的dataModel();
字符串名称=cursor.getString(cursor.getColumnIndexOrThrow(“名称”);
字符串结果=cursor.getString(cursor.getColumnIndexOrThrow(“结果”);
dataModel.setName(name);
dataModel.setResult(result);
追加(数据模型);
data.add(dataModel);
}
返回数据;
}
公共数据库(){
SQLITEDABASE SQLITEDABASE=getWritableDatabase();
字符串clearDBQuery=“DELETE FROM”+结果\表\名称;
execSQL(clearDBQuery);
}
公共无效删除条目(长行){
SQLITEDABASE SQLITEDABASE=getWritableDatabase();
删除(结果表名称,结果列ID+“=”+行,空);
}}
这是加载RecycleWeber的片段

public class ResultsFragment extends Fragment {

DataBHelper database;
RecyclerView recyclerView;
DatabaseAdapter recycler;
public List<DataModel> datamodel;

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_results,
            container, false);
    datamodel =new ArrayList<DataModel>();
    recyclerView = (RecyclerView) view.findViewById(R.id.app_recycle_view);
    database = new DataBHelper(getActivity());
    datamodel =  database.readDB();
    recycler = new DatabaseAdapter(datamodel, getActivity());
    RecyclerView.LayoutManager reLayoutManager =new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(reLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(recycler);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
    if (datamodel.isEmpty()) {
        recyclerView.setVisibility(View.GONE);
        imageView.setVisibility(View.VISIBLE);
    }
    else {
        recyclerView.setVisibility(View.VISIBLE);
        imageView.setVisibility(View.GONE);
    }
    return view;
}}
公共类ResultsFragment扩展了片段{
数据库;
回收视图回收视图;
数据库适配器回收器;
公共列表数据模型;
@凌驾
创建视图上的公共视图(布局、充气机、最终视图组容器、,
Bundle savedInstanceState){
最终视图=充气机充气(R.layout.fragment_结果,
货柜(虚假);;
datamodel=新的ArrayList();
recyclerView=(recyclerView)视图.findViewById(R.id.app\u recycle\u视图);
数据库=新的DataHelper(getActivity());
datamodel=database.readDB();
雷西
@Override
public void onBindViewHolder(Myholder holder, int position) {
    DataModel dataModel = dataModelArrayList.get(position);
    holder.name.setText(dataModel.getName());
    holder.result.setText(dataModel.getResult());
    holder.id = dataModel.getId();
}
                    dataModelArrayList.remove(getAdapterPosition());
                    notifyItemRemoved(getAdapterPosition());