2017-08-22 6 views
0

これはリストビューのonclickリスナーを示しています。アイテムをクリックするとダイアログを開き、sqlite情報を表示したいと思います。リストビューアイテムをクリックすると、日付とノートが表示されます。以下は私の試みですが、うまくいきません。また、私はかなりAndroidプログラミングに新しいので、あなたが私のために非常に役立つだろうコードで問題を並べ替えることができる場合。sqliteデータベースから特定のデータを読み込み、リストビュー項目をクリックしたときにダイアログに表示する方法を教えてください。

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


} 

答えて

0

ここCursorAdapterではなく、ListAdapterを使用しています(これはトーストでテストされた、displayNoteDate作品と仮定して)解決策は、です。

利点は2倍であり、中間配列を作成する必要はなく、onItemClickListener内のすべてのデータを使用できます。

一つの落とし穴しかしカーソル特殊なアダプタは、私がヘルパーにonCreate方法を変更するなどの _id をという名前の列が、あることを期待していることである: - _id

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

    } 

すなわちID

を交換します

私はいくつかのデータを追加するために以下のものを追加しました: -

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

た)に密接(カーソルからデータを取得onItemClick本体、を除く)あなたに関する(カーソルなどのデータを取得するための最初の行以外の)Iが使用される実際のコード: -

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

expensedataCursor expensedata;

を使用して、クラス変数として宣言された、それが終了したときにカーソルをクローズする必要があります。私はアクティビティを使用して、このためにonDestroyメソッドを使用しました。

実行すると、それが表示されます -

enter image description here

56.78は、その後、(同様に、他のリストアイテムのために)クリックした場合: -

enter image description here

0

この方法

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

} 

を使用している限りトーストは、あなたのデータをエコーとして、あなたは成功し、データベースからそれを読んで知っています。

関連する問題