Android 关于定制阵列适配器的几个问题

Android 关于定制阵列适配器的几个问题,android,sqlite,android-arrayadapter,Android,Sqlite,Android Arrayadapter,所以我有点困惑 我的代码从sqlite数据库中获取信息并填充列表,然后使用标准阵列适配器显示列表。我想做的是,在这个列表中,如果“已完成”表行值为“是”,则行颜色为绿色 以下是所用表格的我的db结构: String CREATE_ACHIEVEMENTS_TABLE = "CREATE TABLE achievements (" + "id INTEGER PRIMARY KEY," + "name VARCHAR,"

所以我有点困惑

我的代码从sqlite数据库中获取信息并填充列表,然后使用标准阵列适配器显示列表。我想做的是,在这个列表中,如果“已完成”表行值为“是”,则行颜色为绿色

以下是所用表格的我的db结构:

    String CREATE_ACHIEVEMENTS_TABLE = "CREATE TABLE achievements ("
             + "id INTEGER PRIMARY KEY,"
             + "name VARCHAR,"
             + "type VARCHAR,"
             + "value VARCHAR,"
             + "completed VARCHAR"
             + ")";
下面是我从数据库获取列表的代码:

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;
}
publicArrayList获取成就(上下文){
ArrayList AchieventList=新建ArrayList();
String selectQuery=“按id asc从成就订单中选择*”;
SQLiteDatabase db=this.getWritableDatabase();
Cursor Cursor=db.rawQuery(selectQuery,null);
如果(光标!=null){
if(cursor.moveToFirst()){
做{
if(cursor.getString(4.equals)(“是”)){
add(cursor.getString(1)+(completed)”;
}
否则{
add(cursor.getString(1));
}
}while(cursor.moveToNext());
}
}
否则{
add(context.getResources().getString(R.string.na));
}
cursor.close();
db.close();
返回成就列表;
}
这是我的定制阵列适配器:

public class AchievementAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;

    public AchievementAdapter(Context context, String[] values) {
        super(context, R.layout.achievements, values);
        this.context = context;
        this.values = values;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;

        if (row == null) {
            LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.achievement_item, parent, false);
        }

        return row;
    }
}
公共类实现适配器扩展了ArrayAdapter{
私人最终语境;
私有最终字符串[]值;
公共实现适配器(上下文,字符串[]值){
超级(背景、R.布局、成就、价值观);
this.context=上下文;
这个值=值;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
if(行==null){
LayoutFlater充气器=(LayoutFlater)this.getContext().getSystemService(Context.LAYOUT\u充气器\u服务);
row=充气机。充气(R.LAYOU.U项目,父项,false);
}
返回行;
}
}

我真的不知道从这里到哪里去。这是我的第一个android应用程序,我学到了很多,但我似乎不知道如何实现定制ArrayAdapter的简单功能……我找到的所有教程都包含了一系列我不想要的功能。如果列表项的“已完成”表值为“是”,我要做的就是将列表项的文本颜色设为绿色。…

首先,我建议使用游标适配器而不是arrayAdapter。使用游标适配器,您将有一个指向DB的指针,这样您就可以从那里获得所有信息

如果你那样做。。。适配器的代码应该如下所示

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;
    }
}
然后使用以下命令创建适配器:

Cursor cursor = db.rawQuery(selectQuery, null);
mAdapter = new MyCursorAdapter(this, cursor);
说了这么多。。。如果您想使用arrayAdapter并更改textview, 在getView中:

String item = (String) getItem(position);
if(item.contains("(completed)"){
    TextView tv = (TextView) row.findViewById(R.id.NAMEOFTEXTVIEW);
    tv.setTextColor(Color.GREEN);
}

我应该注意的是,使用cursorAdapter时,您应该保持光标处于打开状态,然后在onStop中将其关闭(在onRestart中重新打开)

首先,我建议使用cursorAdapter而不是arrayAdapter。使用游标适配器,您将有一个指向DB的指针,这样您就可以从那里获得所有信息

如果你那样做。。。适配器的代码应该如下所示

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;
    }
}
然后使用以下命令创建适配器:

Cursor cursor = db.rawQuery(selectQuery, null);
mAdapter = new MyCursorAdapter(this, cursor);
说了这么多。。。如果您想使用arrayAdapter并更改textview, 在getView中:

String item = (String) getItem(position);
if(item.contains("(completed)"){
    TextView tv = (TextView) row.findViewById(R.id.NAMEOFTEXTVIEW);
    tv.setTextColor(Color.GREEN);
}

我应该注意到,使用游标适配器时,您应该保持游标打开,并在onStop中关闭它(在onRestart中重新打开)

最近所有的向下投票是怎么回事?现在,人们只是来投票表决问题,而没有在这个网站上提供任何解释或帮助吗?最近所有的投票表决结果是什么?人们现在只是来投票,而没有在这个网站上提供任何解释或帮助吗?非常感谢你,我甚至不知道cursoradapter。非常有用。谢谢你试着帮助我,而不是像其他人那样对我投否决票。非常感谢你,我甚至都不知道cursoradapter。非常有用。谢谢你试着帮助我,而不是像其他人一样对我投反对票。