2013-06-27 122 views
2

我的應用程序基於在用戶輸入「添加類別」按鈕時顯示對話框。然後它應該將數據保存到SQL數據庫中,並填充用戶添加的每個項目的列表視圖。我選擇SQL數據庫是因爲我希望在用戶結束應用程序時保存數據。我如何實際填充這些項目的列表視圖?以下是我迄今爲止:使用sql數據庫項目填充列表視圖

public class CategoryDatabase { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_CATEGORY = "category"; 

private static final String DATABASE_NAME = "DBCategory"; 
private static final String DATABASE_TABLE = "categoryTable"; 
private static final int DATABASE_VERSION = 1; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 

public CategoryDatabase(Context c){ 
    ourContext = c; 
} 

public CategoryDatabase open() throws SQLException{ 
    ourHelper = new DbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 

public void close(){ 
    ourHelper.close(); 
} 

private static class DbHelper extends SQLiteOpenHelper{ 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
       KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_CATEGORY + " TEXT NOT NULL);" 
     ); 
    } 

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

} 

public long createEntry(String category) { 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_CATEGORY, category); 
    return ourDatabase.insert(DATABASE_TABLE, null, cv); 
} 


} 

和主要活動:

public class MainActivity extends Activity { 

final Context context = this; 
ArrayAdapter<String> arrayAdapter; 
ArrayList<String> listItems = new ArrayList<String>(); 
ListView lv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    lv = (ListView)findViewById(R.id.listView1); 
    arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, listItems); 
    lv.setAdapter(arrayAdapter); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch(item.getItemId()){ 
    case R.id.menu_add_cat: 

     LayoutInflater li = LayoutInflater.from(context); 
     View promptAdd = li.inflate(R.layout.prompt_add, null); 

     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); 

     //set prompts.xml to alertDialogBuilder 
     alertDialogBuilder.setView(promptAdd); 

     final EditText etAddCat = (EditText)promptAdd.findViewById(R.id.etDialogInput); 

     //set a dialog message 
     alertDialogBuilder.setPositiveButton("Done", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
      /* 
      * add a cat here 
      * if(null != input && input.length() > 0){ 
        listItems.add(input); 
        arrayAdapter.notifyDataSetChanged(); 
       }else{ 
        Toast.makeText(getApplicationContext(), "Please enter a new category", Toast.LENGTH_LONG).show(); 

       } 
      */ 
       boolean didItWork = true; 
       try{ 
        String category = etAddCat.getText().toString(); 
        CategoryDatabase entry = new CategoryDatabase(MainActivity.this); 
        entry.open(); 
        entry.createEntry(category); 

        entry.close(); 
       }catch(Exception e){ 
        didItWork = false; 
        String error = e.toString(); 
        Dialog d = new Dialog(MainActivity.this); 
        d.setTitle("Dang it ! "); 
        TextView tv = new TextView(MainActivity.this); 
        tv.setText(error); 
        d.setContentView(tv); 
        d.show(); 
       }finally{ 
        if(didItWork){ 
         Dialog d = new Dialog(MainActivity.this); 
         d.setTitle("Heck yea ! "); 
         TextView tv = new TextView(MainActivity.this); 
         tv.setText("Success"); 
         d.setContentView(tv); 
         d.show(); 
        } 
       } 


      } 
     }) 
     .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 
     // create alert dialog 
     AlertDialog alertDialog = alertDialogBuilder.create(); 

     // show it 
     alertDialog.show(); 
     break; 
    } 
    //return super.onOptionsItemSelected(item); 
    return true; 
} 



}// end of MainActivity 
+0

我曾嘗試你的代碼不能與菜單項點擊按鈕。它可以工作,如果你添加下面。讓我知道如果您需要進一步的幫助 – Raghunandan

回答

2

CategoryDatabase類創建一個功能getAllCategory()

public List<String> getAllCategory() { 
    List<String> List = new ArrayList<String>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + DATABASE_TABLE; 
    Cursor cursor = ourDatabase.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      List.add(cursor.getString(1)); 
     } while (cursor.moveToNext()); 
    } 
    return List; 
    } 

將項目填充到列表視圖。

在你的MainActivity說按鈕點擊。

CategoryDatabase entry = new CategoryDatabase(MainActivity.this); 
      entry.open(); 
      List<String> all = entry.getAllCategory(); 
      lv = (ListView)findViewById(R.id.listView1); 
      arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, all); 
      lv.setAdapter(arrayAdapter); 

編輯:

onCreate

CategoryDatabase entry = new CategoryDatabase(MainActivity.this); 
      entry.open(); 
      List<String> all = entry.getAllCategory(); 
       if(all.size()>0) // check if list contains items. 
       {  
      lv = (ListView)findViewById(R.id.listView1); 
      arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, all); 
      lv.setAdapter(arrayAdapter); 
       } 
       else 
       { 
        Toast.makeText(MainActivity.this,"No items to display",1000).show(); 
       } 
+0

,只有當我點擊添加貓按鈕,最初當我啓動應用程序,它是空白的,當我點擊按鈕出現 – Dodi

+0

@Frugo您可以移動代碼的第二部分到'onCreate'。我會編輯我的回答 – Raghunandan

+0

@Frugo檢查編輯回答 – Raghunandan