【问题标题】:i still can not figure out custom cursor adapters with sqlite results我仍然无法找出带有 sqlite 结果的自定义光标适配器
【发布时间】:2012-05-30 19:10:41
【问题描述】:

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

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

【问题讨论】:

    标签: android sqlite listview android-cursoradapter


    【解决方案1】:

    由于我无法重现您的开发环境,所以我可以做的就是重构您的代码:

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

    请尝试一下,如果有语法错误,请修复并告诉我它是如何工作的。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多