2012-08-24 103 views
1

這是我當前的適配器。使用ListView刪除SQLite行

這是我試圖轉換日期。

+0

有幾種方法可以做到這一點。 (我將從最簡單的開始。)你的行佈局是什麼樣的? – Sam

+0

我使用'long'值來刪除行。我將代碼添加到了我的第一篇文章中。 – user1617102

+0

我在問你在ListView中使用的XML佈局,這是什麼佈局? (如果您使用ListView的多項選擇功能,這非常簡單!) – Sam

回答

0

我開始改變你的適配器一個CursorAdapter但坦率地說這將是相同的,因爲這SimpleCursorAdapter例子(我更新,以反映你的代碼,盡我所能。):

public class Example extends Activity { 
    SimpleCursorAdapter adapter; 
    Database database; 
    ListView listView; 

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

     database = new Database(this); 
     database.open(); 

     // See my note below for a detailed explanation of this 
     Cursor cursor = database.getAllNames(); 
     adapter = new SimpleCursorAdapter(this, 
       android.R.layout.simple_list_item_checked, 
       cursor, 
       new String[] { "name" }, // "name" is the column in your database that I describe below 
       new int[] {android.R.id.text1}, 0); 

     listView = (ListView) findViewById(R.id.list); 
     listView.setAdapter(adapter); 
     listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

     Button delete = (Button) findViewById(R.id.delete_button); 
     delete.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       long[] checkedIds = listView.getCheckedItemIds(); 
       for(long id : checkedIds) 
        database.deleteName(id); 

       listView.clearChoices(); 
       adapter.changeCursor(database.getAllNames()); 
      } 
     }); 
    } 

    @Override 
    protected void onDestroy() { 
     database.close(); 
     super.onDestroy(); 
    } 
} 

好了,你的所有需求使這項工作是一種方法,它將返回一個Cursor與您的數據庫類中的所有名稱(我稱之爲getAllNames())。現在我假設您的表格模式如下所示:

CREATE TABLE Names (
    _id INTEGER PRIMARY KEY, 
    names TEXT); 

您可以相應地進行調整。你Database.getAllNames()方法應該使用這樣的查詢:

"SELECT _id, name FROM Names;" 

或者,如果你想要的名稱的字母順序排列:

"SELECT _id, name FROM Names ORDER BY name;" 

總之它看起來像:

public Cursor getAllNames() { 
    return NameDatabase.rawQuery("SELECT _id, name FROM Names ORDER BY name;", null); 
} 

我希望解釋一些事情,老實說,這是做你想做的最簡單的方法。


加上你自己的行(列表項)佈局

添加自己的佈局是很簡單的。既然你喜歡simple_list_item_checked.xml的外觀,讓我們將它複製的佈局和調整它爲你的顏色:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:checkMark="?android:attr/textCheckMark" 
    android:gravity="center_vertical" 
    android:paddingLeft="6dip" 
    android:paddingRight="6dip" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

所有你需要補充的是:

android:background="#ffffffff" 
    android:textColor="#ff000000" 

(請注意,由於只有一個元素一個ViewGroup是沒有必要的;沒有LinearLayout,沒有RelativeLayout等。另外"@android:id/text1"是我們在SimpleCursorAdapter android.R.id.text1中引用的id,當你改變佈局時需要適當地改變它們。)

但是如果你只想反轉顏色考慮使用不同的主題爲你整個應用程序。打開你的清單,並添加這個主題:

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.Light" > 

默認情況下,Android使用Theme.Dark,只需將其更改爲Theme.Light。現在每個項目默認都有白色背景和黑色文本!

小的調整getView()

以供將來參考,在適配器中的getView()調用getLayoutInflater()爲每一個新行。您只需在構造函數中獲取一次LayoutInflater並將其保存在一個變量中,可能爲LayoutInflater mLayoutInflater,然後在mLayoutInflater.inflate(...)的getView()中使用它。

希望有幫助!

+0

我正在使用CustomAdapter。我將它添加到我的第一篇文章中。 – user1617102

+0

我看到你實際上擴展了一個ArrayAdapter,它不像CursorAdapter那樣保留SQLite ID。 (這是你之前看到的。)讓我們改變它來擴展一個CursorAdapter。 **還**你使用getView()和ViewHolder()_perfectly_。 (Upvote就是爲此。) – Sam

+0

Heya,現在刪除作品和ListView也起作用。感謝您向我展示SimpleCursorAdapter的魔力。 :)現在只有一個小問題。 CursorAdapter使用標準佈局(android.R.layout.simple_list_item_checked),我無法用我的行佈局替換它。我的意思是這不會成爲問題,因爲這個標準看起來也很棒。但文本的顏色似乎是(Alpha = 0),我的意思是它是隱形的,直到我點擊它。然後textcolor變黑。你有任何想法如何解決這個問題? – user1617102