使用ListView删除SQLite行

时间:2012-08-24 21:26:35

标签: android android-listview

这是我目前的适配器。

这是我试图转换日期。

1 个答案:

答案 0 :(得分: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();
    }
}

好的,你需要做的就是在数据库类中返回一个带有所有名称(我称之为getAllNames())的Cursor的方法。现在我假设您的表架构看起来像这样:

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中引用的id`android.R.id.text1&# 39;,当你改变布局时,你需要适当地改变它们。)

然而如果您只想反转颜色,请考虑为整个应用使用不同的主题。打开你的Manifest并添加这个主题:

<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()中使用它。

希望有所帮助!