2017-08-22 1 views
0

Cela montre ma listview onclick listener et je voudrais ouvrir une boîte de dialogue quand un article est cliqué et pour afficher des informations sqlite.Comment puis-je obtenir la date et la note lorsque l'on clique sur l'élément listview. Ce qui suit est ma tentative, mais cela ne fonctionne pas. Aussi, je suis assez nouveau pour la programmation Android, donc si vous pouvez trier le problème dans le code qui serait très utile pour moi.Comment puis-je lire certaines données de la base de données sqlite et les afficher dans une boîte de dialogue lors d'un clic sur un élément listview?

 ListAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, listData); 
     mListView.setAdapter(adapter); 

     //set an onItemClickListener to the ListView 
     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       String name = adapterView.getItemAtPosition(i).toString(); 
       Log.d(TAG, "onItemClick: You Clicked on " + name); 

       Cursor data = mDatabaseHelper.getexpenseItemID(name); //get the id associated with that name 
       int itemID = -1; 
       while(data.moveToNext()){ 
        itemID = data.getInt(0); 
       } 
       if(itemID > -1){ 
        displayNoteDate(mDatabaseHelper.getexpenseNote(data2),mDatabaseHelper.getexpenseDate(data1)); 
       } 
       else{ 
        toastMessage("No ID associated with that name"); 
       } 
      } 
     }); 

    public void displayNoteDate(String noteContent, String dateValue) { 
     final Dialog builder = new Dialog(getActivity()); 
     builder.setContentView(R.layout.custom_dialog); 

     builder.setTitle("Display note date"); 

     TextView note = (TextView)builder.findViewById(R.id.note); 
     TextView date = (TextView)builder.findViewById(R.id.date); 

     //add the database note and date 
     note.setText(noteContent); 
     date.setText(dateValue); 

     Button closeButton = (Button)builder.findViewById(R.id.close); 
     closeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       builder.dismiss(); 
      } 
     }); 
     builder.show(); 
    } 

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper { 
private static final String TAG = "DatabaseHelper"; 

public static final String DATABASE_NAME = "budget.db"; 
public static final String TABLE_NAME = "expense_table"; 
public static final String TABLE_NAME2 = "income_table"; 
public static final String COL_1 = "ID"; 
public static final String COL_2 = "ID2"; 
public static final String EXPENSE_AMOUNT = "AMOUNT"; 
public static final String EXPENSE_DATE = "DATE"; 
public static final String EXPENSE_NOTES = "NOTES"; 
public static final String INCOME_AMOUNT = "AMOUNT"; 
public static final String INCOME_DATE = "DATE"; 
public static final String INCOME_NOTES = "NOTES"; 

public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, 3); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,AMOUNT INTEGER,DATE INTEGER,NOTES TEXT)"); 
    db.execSQL("create table " + TABLE_NAME2 + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,AMOUNT INTEGER,DATE INTEGER,NOTES TEXT)"); 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME2); 
    onCreate(db); 
} 

public boolean insertexpenseData(String amount_expense, String date_expense, String notes_expense) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(EXPENSE_AMOUNT, amount_expense); 
    contentValues.put(EXPENSE_DATE, date_expense); 
    contentValues.put(EXPENSE_NOTES, notes_expense); 
    long result = db.insert(TABLE_NAME, null, contentValues); 
    if (result == -1) 
     return false; 
    else 
     return true; 
} 

public boolean insertincomeData(String amount_income, String date_income, String notes_income) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(INCOME_AMOUNT, amount_income); 
    contentValues.put(INCOME_DATE, date_income); 
    contentValues.put(INCOME_NOTES, notes_income); 
    long result = db.insert(TABLE_NAME2, null, contentValues); 
    if (result == -1) 
     return false; 
    else 
     return true; 
} 

public Cursor getexpenseData() { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor res = db.rawQuery("select * from " + TABLE_NAME, null); 
    return res; 
} 

public Cursor getincomeData() { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor res = db.rawQuery("select * from " + TABLE_NAME2, null); 
    return res; 
} 

public Cursor getexpenseDate(Cursor date){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + EXPENSE_DATE + " = '" + date + "'"; 
    Cursor data1 = db.rawQuery(query, null); 
    return data1; 

} 

public Cursor getexpenseNote(Cursor note){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + EXPENSE_NOTES + " = '" + note + "'"; 
    Cursor data2 = db.rawQuery(query, null); 
    return data2; 
    } 



public Cursor getexpenseItemID(String name){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String query = "SELECT " + COL_1 + " FROM " + TABLE_NAME + " WHERE " + EXPENSE_AMOUNT + " = '" + name + "'"; 
    Cursor data = db.rawQuery(query, null); 
    return data; 
} 

public Cursor getincomeItemID(String name){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String query = "SELECT " + COL_2 + " FROM " + TABLE_NAME2 + " WHERE " + INCOME_AMOUNT + " = '" + name + "'"; 
    Cursor data = db.rawQuery(query, null); 
    return data; 
} 

public boolean updateexpenseData(String id, String amount, String date, String notes) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL_1, id); 
    contentValues.put(EXPENSE_AMOUNT, amount); 
    contentValues.put(EXPENSE_DATE, date); 
    contentValues.put(EXPENSE_NOTES, notes); 
    db.update(TABLE_NAME, contentValues, "ID = ?", new String[]{id}); 
    return true; 
} 

public boolean updateincomeData(String id, String amount, String date, String notes) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL_2, id); 
    contentValues.put(INCOME_AMOUNT, amount); 
    contentValues.put(INCOME_DATE, date); 
    contentValues.put(INCOME_NOTES, notes); 
    db.update(TABLE_NAME2, contentValues, "ID = ?", new String[]{id}); 
    return true; 
} 

public Integer deleteexpenseData(String id) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete(TABLE_NAME, "ID = ?", new String[]{id}); 
} 

public Integer deleteincomeData(String id) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete(TABLE_NAME2, "ID = ?", new String[]{id}); 
} 


} 

Répondre

0

est ici une solution (en supposant que les œuvres displayNoteDate, cela a été testé avec un Toast), qui utilise un CursorAdapter plutôt qu'un ListAdapter.

L'avantage est double, pas besoin de créer un tableau intermédiaire et vous avez TOUTES les données disponibles dans le onItemClickListener.

Un écueil est bien qu'un adpater curseur attend une colonne nommée _id, en tant que tel je l'ai changé la méthode onCreate dans l'assistant à: -

public void onCreate(SQLiteDatabase db) { 
     db.execSQL("create table " + TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT,AMOUNT INTEGER,DATE INTEGER,NOTES TEXT)"); 
     db.execSQL("create table " + TABLE_NAME2 + " (_id INTEGER PRIMARY KEY AUTOINCREMENT,AMOUNT INTEGER,DATE INTEGER,NOTES TEXT)"); 

    } 

-à-dire _id remplacement ID

À des fins de test, j'ai inclus ce qui suit pour ajouter quelques données: -

mDatabaseHelper.insertexpenseData("100.00","21/03/1904","Wow this old?"); 
    mDatabaseHelper.insertexpenseData("56.78","31/12/2010","New Celebrations"); 
    mDatabaseHelper.insertexpenseData("250.00","23/08/2017","Birthday Present"); 

Le code actuel je (qui d'autre que la première ligne pour obtenir les données avec un curseur) se rapproche le vôtre (à l'exception du corps de onItemClick, qui obtient les données du curseur)) était: -

....... 
    expensedata = mDatabaseHelper.getexpenseData(); 
    SimpleCursorAdapter sca = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      expensedata, 
      new String[]{DatabaseHelper.EXPENSE_AMOUNT}, 
      new int[]{android.R.id.text1}, 0); 
    listdata.setAdapter(sca); 
    listdata.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      int csrpos = expensedata.getPosition(); 
      expensedata.moveToPosition(i); 
      displayNoteDate(
        expensedata.getString(expensedata.getColumnIndex(DatabaseHelper.EXPENSE_NOTES)), 
        expensedata.getString(expensedata.getColumnIndex(DatabaseHelper.EXPENSE_DATE))); 
      expensedata.moveToPosition(csrpos); 
     } 
    }); 


} 

//!!!NOTE!!! Used for testing so don't use this method. 
private void displayNoteDate(String notes, String date) { 
    Toast.makeText(this,"Notes=" + notes + " Incurred on " + date,Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    expensedata.close(); 
} 

Remarque expensedata a été déclarée comme une variable de classe à l'aide Cursor expensedata;

Notez que vous devez fermer le curseur lorsque vous avez terminé avec lui. J'ai utilisé une activité et donc utilisé la méthode onDestroy pour cela.

Lorsque ce dernier affiche: -

enter image description here

Lorsque 56,78 est clicked (de même pour les autres éléments de la liste), puis: -

enter image description here

0

Utilisez cette méthode

Cursor cursor = mDatabaseHelper.getexpenseItemID(name); 

if (cursor.getCount() > 0){ 
    cursor.moveToFirst(); 
    String noteContent = cursor.getString(cursor.getColumnIndex("NOTES")); 
    String date = cursor.getString(cursor.getColumnIndex("DATE")); 
    Toast.makeText(Activity.this, noteContent, Toast.LENGTH_SHORT).show(); 
    Toast.makeText(Activity.this, date, Toast.LENGTH_SHORT).show(); 
    displayNoteDate(noteContent, date); 

} 

Tant que le pain fait écho à vos données, sachez que vous avez lu avec succès à partir de votre base de données.