0

原因を突き止めることができないような問題が発生しています。これは、単にローダーに精通していないことが原因である可能性があります...

最初の選択が行われるまで、スピナーのプロンプトを「閉じた」位置(単一行表示)に設定するために使用するカスタムアダプターがあります。以前はこれを使用して大成功を収めましたが、今回は機能していません。唯一の違いは、現在ローダーを使用していることです。

オーバーライドされたメソッドでアダプターがカーソルにアクセスしようとするとgetView、カーソルがnullになり、もちろんnullポインター例外で強制終了します。getDropDownViewドロップダウンにデータが入力されると、メソッド(オーバーライドしません)がカーソルにアクセスできるので、カーソルがnullになる方法がわかりません...

私が考えることができるのは、何らかの理由でgetView、ローダーが機能している間、メソッドがプレースホルダーとして渡された元のnullを保持しているということだけです。そのリファレンスを使うと変わると思いますchangeCursorが、そうではないようです。

メインアクティビティアダプタの呼び出し

adapter = new CursorAdapter_SpinnerPrompt(this,
    R.layout.rowlayout_black, null, new String[] { ThreadMillDB.THREADMILL_THREAD }, new int[] { R.id.ListItem });
mThreadChooser.setAdapter(adapter);

関連するローダーコード

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.changeCursor(cursor);
}

アダプターコード

public class CursorAdapter_SpinnerPrompt extends SimpleCursorAdapter {
    private Context context;
    private int layout;
    private Cursor c;
    private String[] from;
    private int[] to;
    public static boolean spinnerFlag = false;

    public CursorAdapter_SpinnerPrompt(Context context, int layout, Cursor c,
            String[] from, int[] to) {
        super(context, layout, c, from, to);
        this.context = context;
        this.layout = layout;
        this.c = c;
        this.from = from;
        this.to = to;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
            convertView = View.inflate(context, layout, null);
        if (spinnerFlag != false) {
            c.moveToPosition(position);          // cursor is null here... why?  How to fix?
            TextView tv = (TextView) convertView;
            tv.setText(c.getString(c.getColumnIndex(ThreadMillDB.THREADMILL_THREAD)));
        } else {
            TextView tv = (TextView) convertView;
            tv.setText("Choose a thread");
            tv.setTextColor(Color.parseColor("#778899"));
        }
        return convertView;
    }
}

アップデート

そしてもちろん、これを入力することで、私は解決策を見つけまし。アダプターの作成をアクティビティから移動してonCreateonLoadFinishedカーソルを呼び出しに移動しました。しかし、これは私がやろうとしていた方法よりも厄介なようです。アダプタのインスタンス化をメソッドに移動せずに機能させるために、元のメソッド(上記に表示)に変更を加えることはできますonLoadFinishedか?

4

1 に答える 1

1

あなたの疑わしいものは正しいです。

コンストラクターで覚えているカーソル参照は、渡したものと同じではありませんchageCursor(Cursor c)。CursorAdapterでカーソルを取得する適切な方法は、getCursor()渡したカーソルへの参照を取得するよりも呼び出すことですchangeCursor(Cursor c)

于 2012-12-11T16:25:51.193 に答える