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 ファイルを追加する必要がありますか? リストビューを含むlinearlayoutを含むxmlファイルを追加し、次にlinearlayoutとtextviewを含む別のxmlファイルを追加する必要がありますか? または、リストビューと同じレイアウトにテキストビューを配置しますか? getAchievements() 関数全体をcursoradapterコードに置き換える必要がありますか?

誰かが私を助けてくれたら、とても感謝しています。これを実装する方法が本当にわかりません。いくつかのチュートリアルを読んでみましたが、とても混乱しています。これを行う方法を理解するのに役立つ完全な例または何かを入手できれば、多くのことを助けてくれます。

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 コードの each (") の前にスペースをとってください。これらは互いにバインドされ、コードを実行できないためです。次のようにします。

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 に答える