0

だから私はここで少し混乱しています....

私のsqliteデータベースから情報を取得してリストを作成し、標準の配列アダプターを使用してリストを表示するコードがあります。私がやりたいのは、このリストで、「完了」テーブルの行の値が「はい」の場合、行の色が緑色になるようにすることです

使用されているテーブルの私のデータベース構造は次のとおりです。

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

ここに私のカスタム配列アダプターがあります:

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

ここからどこへ行けばいいのか本当にわかりません。これは私の最初の Android アプリであり、多くのことを学びましたが、カスタム arrayadapters に関してこの単純なことを達成する方法を理解できないようです....私が見つけたすべてのチュートリアルには、私が望まない機能がたくさん含まれています。私がやろうとしているのは、「完了」テーブルの値が「はい」の場合、リスト項目のテキストの色を緑にすることです...

4

1 に答える 1

4

まず、arrayAdapter ではなく、cursorAdapter を使用することをお勧めします。カーソル アダプターを使用すると、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を使用してテキストビューを変更したい場合は、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 で再度開く) 必要があることに注意してください。

于 2012-05-30T02:21:31.773 に答える