0

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

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

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

我阅读了教程并查看了代码示例,但我无法弄清楚如何使用自定义光标适配器来实现这一点。现在要在列表视图中显示结果,我使用以下代码:

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() 时,如果该行的“完成”设置为“是”,它将使列表视图行中的文本颜色变为绿色在数据库中。我希望这是有道理的。

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

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 文件?我是否必须添加一个带有线性布局的xml文件,里面有一个listview,然后是一个单独的xml文件,里面有一个linearlayout和一个textview?还是我将文本视图放在与列表视图相同的布局中?我用 cursoradapter 代码替换我的整个 getAchievements() 函数吗?

如果有人可以帮助我,我非常感激。我真的不知道如何实现这一点。我试过阅读一些教程,但它们让我很困惑。如果我能得到一个完整的例子或其他东西来帮助我理解如何做到这一点,那将对我有很大帮助。

4

2 回答 2

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

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

于 2012-05-30T19:17:25.833 回答
0

只需在每个 (") 之前为您的 sqlite 代码占用空间,因为它们相互绑定并且代码无法执行。让它像这样:

String CREATE_ACHIEVEMENTS_TABLE = "CREATE TABLE achievements ("
         + " id INTEGER PRIMARY KEY,"
         + " name VARCHAR,"
         + " type VARCHAR,"
         + " value VARCHAR,"
         + " completed VARCHAR"
         + ")";
于 2015-07-25T08:04:08.090 回答