Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

Θα ήθελα την βοήθεια σας για να μπορώ να διαγράφω με 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());

    }
}




}

 

1.png

2.png

3.png

Δημοσ. (επεξεργασμένο)
    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 ή έστω σε μια συυναρτηση (να ναι πιο ωραιο εμφανισιακά)

Επεξ/σία από Shai-Hulud
  • Like 1
Δημοσ. (επεξεργασμένο)

Ευχαριστώ πολύ φιλαράκι για την απάντηση.

Έχω πρόβλημα:

Διαγράφονται οι τιμές αλλά οταν πάω πίσω και πατήσω το κουμπί 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();
    }



 

Επεξ/σία από Eddie95
Δημοσ.

ναι έτσι όπως το γραψες το 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 και άρα μοναδικό

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...