我仍然无法找到带有sqlite结果的自定义游标适配器

时间:2012-05-30 19:10:42

标签: android sqlite listview android-cursoradapter

我无法弄清楚这一点。这是我的第一个Android应用程序,所以请帮助我,并与我裸露这样一个菜鸟....

我有一个具有以下结构的sqlite表:

    String CREATE_ACHIEVEMENTS_TABLE = "CREATE TABLE achievements ("
             + "id INTEGER PRIMARY KEY,"
             + "name VARCHAR,"
             + "type VARCHAR,"
             + "value VARCHAR,"
             + "completed VARCHAR"
             + ")";

现在我要做的就是让它如果“完成”列设置为“是”,我希望列表视图中行的文本颜色为绿色。

我已阅读教程并查看代码示例,我只是想弄清楚如何使用自定义cursoradapter实现它。现在要在列表视图中显示结果我使用以下代码:

ShowAchievements.java(点击菜单项“查看成就”时启动此活动):

package com.dd.qsg;

import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class ShowAchievements extends ListActivity {

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

        DatabaseHandler db = new DatabaseHandler(this);
        ArrayList<String> achievements = db.getAchievements(this);

        this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, achievements));
    } 

}

在上述活动中调用的getAchievements()函数:

public ArrayList<String> getAchievements(Context context) {
    ArrayList<String> achievementList = new ArrayList<String>();
    String selectQuery = "SELECT * FROM achievements ORDER BY id asc";

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                if (cursor.getString(4).equals("yes")) {
                    achievementList.add(cursor.getString(1)+" (completed)");
                }
                else {
                    achievementList.add(cursor.getString(1));
                }
            } while (cursor.moveToNext());
        }
    }
    else {
        achievementList.add(context.getResources().getString(R.string.na));
    }

    cursor.close();
    db.close();
    return achievementList;
}

就像我说我想要实现一个自定义的cursoradapter,这样当我从我的ShowAchievements活动中调用getAchievements()时,如果“completed”设置为“yes”,它将使listview行中的文本颜色为GREEN对于数据库中的那一行。我希望这是有道理的。

在另一个问题中,我问有人帮助过我,他们告诉我实施这样的事情:

private class MyCursorAdapter extends CursorAdapter {

    public MyCursorAdapter(Context context, Cursor c) {
        super(context, c);
    }

    @Override
    public void bindView(View v, Context context, Cursor cursor) {
        if(cursor.getString(cursor.getColumnIndex("completed").equals("yes")){
            TextView tv = (TextView) v.findViewById(R.id.NAMEOFTEXTVIEW);
            tv.setTextColor(Color.GREEN);
        }
    }

    @Override
    public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
        LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.achievement_item, parent, false);
        return row;
    }
}

我的问题是我如何实现这一点,以便在我的活动中调用getAchievements()时它可以工作?我必须添加哪些XML文件?我是否必须添加一个带有linearview的xml文件,其中包含listview,然后是一个单独的xml文件,其中包含linearlayout和textview?或者我将textview放在listview所在的布局中?用cursoradapter代码替换我的整个getAchievements()函数吗?

如果有人能帮助我,我会非常感激。我真的不知道如何实现这一点。我试过阅读一些教程,他们只是让我很困惑。如果我能得到一个完整的例子或者某些东西来帮助我理解如何做到这一点它会帮助我很多。我没有试图要求别人为我编写我的所有代码,但有些东西可以帮助我完全掌握如何做到这一点非常简单。

2 个答案:

答案 0 :(得分:2)

由于我无法重现您的开发环境,所以我只能重构您的代码:

public class ShowAchievements extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        DatabaseHandler db = new DatabaseHandler(this);
        Cursor cursor = db.getAchievements(this);
        MyCursorAdapter cursorAdapter = new MyCursorAdapter(this, cursor);

        this.setListAdapter(cursorAdapter);
    } 

    private Cursor getAchievements(Context context) {
        String selectQuery = "SELECT * FROM achievements ORDER BY id asc";

        SQLiteDatabase db = this.getWritableDatabase();
        return db.rawQuery(selectQuery, null);
    }

    private class MyCursorAdapter extends CursorAdapter {

        public MyCursorAdapter(Context context, Cursor c) {
            super(context, c);
        }

        @Override
        public void bindView(View v, Context context, Cursor cursor) {
            if(cursor.getString(cursor.getColumnIndex("completed")).equals("yes"){
                TextView tv = (TextView) v.findViewById(R.id.NAMEOFTEXTVIEW);
                tv.setTextColor(Color.GREEN);
            }
        }

        @Override
        public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
            LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.achievement_item, parent, false);
            return row;
        }
    }
}

请尝试一下,修复语法错误(如果有的话)并让我知道它是如何工作的。

答案 1 :(得分:0)

在sqlite代码的每个(“)之前占用空格,因为它们相互绑定而代码无法执行。 像这样:

String CREATE_ACHIEVEMENTS_TABLE = "CREATE TABLE achievements ("
         + " id INTEGER PRIMARY KEY,"
         + " name VARCHAR,"
         + " type VARCHAR,"
         + " value VARCHAR,"
         + " completed VARCHAR"
         + ")";