0

我遇到了一个问题,我似乎无法追查其原因。这可能只是因为我对装载机不熟悉......

我有一个自定义适配器,用于在“关闭”位置(单行显示)设置微调器的提示,直到做出第一个选择。我以前用过这个并取得了很大的成功,但这次它不起作用。唯一的区别是现在我使用的是装载机。

当适配器尝试在我的重写getView方法中访问游标时,游标为空,当然我会因空指针异常而强制关闭。我不明白光标如何在那里为空,因为显然该getDropDownView方法(我没有覆盖)在填充下拉列表时可以访问光标......

我所能想到的是,由于某种原因,该getView方法保留了作为占位符传入的原始空值,而加载器正在工作。我认为当我使用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;
    }
}

更新

当然,在打字时,我想出了一个解决方案。我将适配器的创建从我的活动中移出onCreate并将onLoadFinished光标放入调用中。但是,这似乎比我尝试这样做的方式更混乱。我可以对我的原始方法(如上所示)进行任何修改以使其工作而无需将适配器实例化移动到该onLoadFinished方法?

4

1 回答 1

1

你的怀疑是正确的。

您在构造函数中记住的游标引用与您传递的不同chageCursor(Cursor c)。在 CursorAdapter 上获取光标的正确方法是调用getCursor()而不是获取对传递的光标的引用changeCursor(Cursor c)

于 2012-12-11T16:25:51.193 回答