我遇到了一个问题,我似乎无法追查其原因。这可能只是因为我对装载机不熟悉......
我有一个自定义适配器,用于在“关闭”位置(单行显示)设置微调器的提示,直到做出第一个选择。我以前用过这个并取得了很大的成功,但这次它不起作用。唯一的区别是现在我使用的是装载机。
当适配器尝试在我的重写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
方法?