Eddie95 Δημοσ. 3 Φεβρουαρίου 2018 Δημοσ. 3 Φεβρουαρίου 2018 Καλησπέρα, Θα ήθελα την βοήθεια σας για να μπορώ να διαγράφω με setOnItemLongClickListener και να πετάει ενα alertDialog παράθυρο.Είμαι νέος σε προγραμματισμό android οπότε καταλαβαίνετε. Κώδικας για DatabaseHelper: package com.example.exam; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import android.view.View; import android.widget.ListView; import android.widget.Toast; public class DatabaseHelper extends SQLiteOpenHelper{ private static final String DATABASE_NAME = "myDatabase"; private static final String TABLE_NAME = "GreenHouse"; private static final String DB_NAME = "NAME"; private static final String DB_KG = "KG"; private static final String DB_TIMI = "TIMI"; private static final String DB_DATE = "DATE"; private static final Integer DATABASE_VERSION = 1; //δηλωση βασης public DatabaseHelper(Context context){ super(context,TABLE_NAME ,null, DATABASE_VERSION); } //στην δημιουργια @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table " +TABLE_NAME + "(_ID INTEGER PRIMARY KEY, NAME TEXT, KG TEXT, TIMI TEXT, DATE TEXT)"); Log.e("DATABASE", "Δημιουργήθηκε η Βάση"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } //συναρτηση για να προσθεσουμε τις τιμες στην βαση public boolean addInfo(String name, String kg,String timi, String date) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(DB_NAME,name); cv.put(DB_KG,kg); cv.put(DB_TIMI,timi); cv.put(DB_DATE,date); db.insert(TABLE_NAME,null,cv); return true; } //συναρτηση για να εμφανισουμε ολες τις τιμες public Cursor getAllData(){ SQLiteDatabase db = this.getWritableDatabase(); Cursor result=db.rawQuery("SELECT * FROM "+ TABLE_NAME,null); return result; } } ListAdapter: package com.example.exam; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextClock; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * Created by ndreca on 1/2/2018. */ public class ListAdapter extends ArrayAdapter{ List list = new ArrayList(); public ListAdapter(@NonNull Context context, int resource) { super(context, resource); } static class LayoutHandler{ TextView NAME,KG,TIMI,DATE; } @Override public void add(@Nullable Object object) { super.add(object); list.add(object); } @Override public int getCount() { return list.size(); } @Nullable @Override public Object getItem(int position) { return list.get(position); } @NonNull @Override public View getView(int position, View convertView, ViewGroup parent) { View row=convertView; LayoutHandler layoutHandler; if (row==null) { LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); row=layoutInflater.inflate(R.layout.row_layout,parent,false); layoutHandler = new LayoutHandler(); layoutHandler.NAME=(TextView)row.findViewById(R.id.textN); layoutHandler.KG=(TextView)row.findViewById(R.id.textK); layoutHandler.TIMI=(TextView)row.findViewById(R.id.textT); layoutHandler.DATE=(TextView)row.findViewById(R.id.textD); row.setTag(layoutHandler); }else{ layoutHandler=(LayoutHandler)row.getTag(); } DataProvider dataProvider=(DataProvider)this.getItem(position); layoutHandler.NAME.setText(dataProvider.getName()); layoutHandler.KG.setText(dataProvider.getKg()); layoutHandler.TIMI.setText(dataProvider.getTimi()); layoutHandler.DATE.setText(dataProvider.getDate()); return row; } } Lista: package com.example.exam; import android.app.ListActivity; import android.content.DialogInterface; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import java.util.ArrayList; public class Lista extends AppCompatActivity { DatabaseHelper myHelper; SQLiteDatabase db; Cursor cursor; ListView listView ; ListAdapter listAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lista); listView = (ListView)findViewById(R.id.list_view); myHelper = new DatabaseHelper(getApplicationContext()); db=myHelper.getReadableDatabase(); cursor = myHelper.getAllData(); listAdapter = new ListAdapter(getApplicationContext(),R.layout.row_layout); listView.setAdapter(listAdapter); //προσθηκη στοιχείων στην λιστα με χρηση αντικειμένου if (cursor.moveToFirst()){ do { String name,kg,timi,date; name=cursor.getString(0); kg=cursor.getString(1); timi=cursor.getString(2); date=cursor.getString(3); DataProvider dataProvider = new DataProvider(name,kg,timi,date); listAdapter.add(dataProvider); } while (cursor.moveToNext()); } } }
Shai-Hulud Δημοσ. 5 Φεβρουαρίου 2018 Δημοσ. 5 Φεβρουαρίου 2018 (επεξεργασμένο) public void deleteCoo(int num){ SQLiteDatabase db = getWritableDatabase(); db.execSQL("DELETE FROM " + TABLE_NUMBERS + " WHERE " + COLUMN_LONG + "=\"" + Integer.toString(num) + "\";"); db.close(); } με αυτόν τον κώδικα διαγραφω από το db μου μια καταχώρηση με βάση την τιμή που παίρνω (βαλτο στον databasehelper) listVew.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { listAdapter.rem(position); return true; } με αυτόν διαγράφω μια τιμή, (βαλτο στο oncreate) public void rem(int pos) { Log.i(TAG,"Entering remove"); list.remove(pos); notifyDataSetChanged(); } και αυτό είναι η υλοποιηση του rem στον adapter AlertDialog δεν ξέρω τι θες να κάνει, γραψε και θα σου πω Τέλος αφαίρεσε το SQLiteDatabase db; από το Activity σου, δεν σου χρησιμευει, ούτε το super.add(object); από τον Adapter, δεν κάνει τίποτα,και θα σου λεγα να βάλεις ό,τι κάνεις με το Cursor στο databaseHelper ή έστω σε μια συυναρτηση (να ναι πιο ωραιο εμφανισιακά) Επεξ/σία 5 Φεβρουαρίου 2018 από Shai-Hulud 1
Eddie95 Δημοσ. 5 Φεβρουαρίου 2018 Μέλος Δημοσ. 5 Φεβρουαρίου 2018 (επεξεργασμένο) Ευχαριστώ πολύ φιλαράκι για την απάντηση. Έχω πρόβλημα: Διαγράφονται οι τιμές αλλά οταν πάω πίσω και πατήσω το κουμπί show ξανα εμφανίζονται. listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { listAdapter.rem(position); myHelper.deleteCoo(position); return true; } }); έτσι το έγραψα στο lista.java πρέπει να έχω κάνει λάθος με το deletecoo public void deleteCoo(int num){ SQLiteDatabase db = getWritableDatabase(); db.execSQL("DELETE FROM " + TABLE_NAME + " WHERE " + DB_NAME+ "=\"" + Integer.toString(num) + "\";"); db.close(); } Επεξ/σία 5 Φεβρουαρίου 2018 από Eddie95
Shai-Hulud Δημοσ. 5 Φεβρουαρίου 2018 Δημοσ. 5 Φεβρουαρίου 2018 ναι έτσι όπως το γραψες το deleteCoo δέχεται ένα ακέραιο, εσύ θες String public void deleteCoo(String num){ SQLiteDatabase db = getWritableDatabase(); db.execSQL("DELETE FROM " + TABLE_NAME + " WHERE " + DB_NAME+ "=\"" + num + "\";"); db.close(); } το πρόβλημα είναι οτι έτσι αν πχ το num είναι πχ τομάτα θα διαγράψει όλα τα τομάτα, πρέπει να το περιορίσεις, πχ πέρνα και κάποιο άλλο χαρακτηριστικό, ή το _ID, που είναι primary key και άρα μοναδικό
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα