2017-11-24 1 views
0

Meine App speichert Name und Ergebnis in SQLite-Datenbank und zeigt diese in RecycleViewer. Vorher benutze ich ein listView, wo ich auf LongClick ein Element wie hier löschen konnte LuckyNumbersApk/commit/4cec554359662d557626935046b8de68fb1b5c60 jetzt habe ich auf recyclerView geschaltet ich kann nicht richtig damit umgehen. Wenn ich es lösche, verschwindet es, aber wenn ich das Fragment neu lade, erscheint der gelöschte Eintrag wieder. Ich nehme an, weil das Element nur aus der Liste im Adapter gelöscht wird, aber wie kann ich es aus der Liste löschen, die sich in dem Fragment befindet, das den recylerViewer aufruft?Richtig löschen einen SQLite-Eintrag von einem RecyclerView klicken

Das ist mein Adapter:

public class DatabaseAdapter erweitert RecyclerView.Adapter { Liste dataModelArrayList; Kontext Kontext;

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

Dies ist DataBHelper:

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

Und das ist das Fragment, das recyclerViewer

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

Antwort

0

In onCreateViwHolder lädt:

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

long id; in den ViewHolder, also können Sie mit Ihrem onClick die int id = getAdapterPosition(); und die ID wird die ID aus dem Modell sein.

entfernen noch die Adapterposition verwenden:

    dataModelArrayList.remove(getAdapterPosition()); 
        notifyItemRemoved(getAdapterPosition()); 
+0

Dank Der Artikel ist jetzt richtig gelöscht zu werden :) Obwohl recyclerView nach noch nicht aktualisiert wird, wenn notifyDataSetChanged() –

+0

Alle arbeiten jetzt genannt wird, danke! :) –

Verwandte Themen