de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
Mark D
Mark D
質問

SimpleCursorAdapter + Sqliteを使用してもListActivityでは機能しないようです

私はちょうど私のアプリのための非常に単純なスコア画面を構築し始めたが、何も起こっていないようだと私は理由を把握することはできません。

ListActivity:

public class HighScoresActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.high_scores);

        ScoresDatabase db = new ScoresDatabase(this);
        Cursor data = db.getHighScores();

        ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, data, new String[] { "level" }, new int[] { R.id.level_text });
        setListAdapter(adapter);

        data.close();
        db.close();
    }
}

high_scores.xml:

<?xml version="1.0" encoding="utf-8"?>


    

    


エラーメッセージはまったくありません。単純に何も起こりません。 そのカーソルが空でないということではなく、adapter.getCount()メソッドをテストすると、〜30が返されます。これは、まさに期待どおりです。

私はすべての関数名がかなり直感的だと思いますが、何か明確化が必要な場合は、ただ質問してください。

どんな援助も大きく改善されています

0 2011-10-27T22:11:53+00:00 4
プログラミング
sqlite
java
android
Squonk
28日 10月 2011 в 12:17
2011-10-28T00:17:32+00:00
さらに
ソース
編集
#56793529
data.close();//DON'T DO THIS

Cursor.close()のドキュメントから

カーソルを閉じて、すべてのリソースを解放し、完全に無効にします。 deactivate()とは異なり、requery()の呼び出しはカーソルを再び有効にしません。

ListView の Adapter は 'live' Cursor を持っていなければ機能しません。また、データベースを閉じることは必ずしも良いことではなく、特定のケースで(私の経験では)悪影響を及ぼす可能性があります - それが問題の原因になるかどうかはわかりません。

EDIT: In light of Dave Newton's comment and having checked some of my own code, the problem will be with calling close() on both the Cursor and also the database. In short, remove the following lines...

data.close();
db.close();
1
0
coder_For_Life22
27日 10月 2011 в 10:13
2011-10-27T22:13:44+00:00
さらに
ソース
編集
#56793527

あなたは電話する必要があります...

db.open();

onCreate()の始めに。

これにより、データベースが開き、データを取得できます。

0
0
Dave Newton
27日 10月 2011 в 10:37
2011-10-27T22:37:28+00:00
さらに
ソース
編集
#56793528

SimpleCursorAdapter ctorの最後のパラメータは、リストレイアウトのフィールド android.R.id.text1 のIDにする必要があります。

R.id.level_text はヘッダーとして使用しているテキストフィールドのIDです。そのテキストはレイアウトファイル内の文字列リソースから設定するか、レイアウトを再利用する場合は onCreate メソッドで動的に設定する必要があります。

0
0
Mark D
28日 10月 2011 в 2:49
2011-10-28T14:49:31+00:00
さらに
ソース
編集
#56793530

私の最初のコードには2つの問題がありました。

最初はMisterSquonkが指摘したように、カーソルとデータベースを早めに閉じます。

2つ目は、データをビューに正しくバインドすることでした。

ここに私の今働いている解決策のコードがあります

HighScoresActivity:

public class HighScoresActivity extends ListActivity {

    private Cursor data;
    private ScoresDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.high_scores);

        db = new ScoresDatabase(this);
        data = db.getHighScores();

        ListAdapter adapter = new SimpleCursorAdapter(
                this, 
                R.layout.high_scores_entry, data, 
                new String[] { "level", "moves" }, 
                new int[] { R.id.level_entry, 
                R.id.moves_entry });

        setListAdapter(adapter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        data.close();
        db.close();
    }
} 

high_scores.xml:

<?xml version="1.0" encoding="utf-8"?>

    

high_scores_entry.xml:

<?xml version="1.0" encoding="utf-8"?>

    
    

最初にデータをバインドした方法は意味をなさない。

0
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 1週間前
2
Hideo Nakagawa
登録済み 1週間前
3
Sergiy Tytarenko
登録済み 1週間前
4
shoxrux azadov
登録済み 1週間前
5
Koreets Koreytsev
登録済み 2週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属