尝试使用自定义适配器设置gridview,我获取光标并在ASyncTask中设置适配器......
以下是我的所有代码:
private class getAllData extends AsyncTask<Context, Void, Cursor> {
protected void onPreExecute () {
dialog = ProgressDialog.show(Shows.this, "",
"Loading shows. Please wait...", true);
}
/** The system calls this to perform work in a worker thread and
* delivers it the parameters given to AsyncTask.execute() */
@Override
protected Cursor doInBackground(Context... params) {
// TODO Auto-generated method stub
JSONParser.getAllData(params[0]);
c = mDbHelper.fetchAllShows();
return c;
}
protected void onPostExecute(Cursor c) {
startManagingCursor(c);
String[] str = new String[] {ShowsDbAdapter.KEY_SHOW_TITLE};
int[] to = new int[] {R.id.textView1};
GridAdapter ga = new GridAdapter(Shows.this, R.layout.icon,c,str,to);
gridView.setAdapter(ga);
dialog.dismiss();
}
}
这是我的适配器......
public class GridAdapter extends SimpleCursorAdapter {
private Context context;
private int mLayout;
private Cursor mCursor;
public GridAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
this.context = context;
mLayout = layout;
this.mCursor = c;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
Cursor c = getCursor();
final LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(mLayout, null);
v.setLayoutParams(new GridView.LayoutParams(150,150));
int nameCol = c.getColumnIndex("show_title");
String name = c.getString(nameCol);
TextView tv = (TextView) v.findViewById(R.id.textView1);
if (name != null) {
Log.e("GRIDVIEW", "I'm in here");
tv.setText(name);
}
return v;
}
public void bindView(View v, Context context, Cursor c) {
int nameCol = c.getColumnIndex("show_title");
String name = c.getString(nameCol);
TextView tv = (TextView) v.findViewById(R.id.textView1);
if (name != null) {
tv.setText(name);
}
ImageView iv = (ImageView) v.findViewById(R.id.album_image);
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
iv.setImageResource(R.drawable.icon);
}
}
我意识到它有点乱,不是最好但它应该有效...这是我的错误:
> 07-05 11:02:32.729: ERROR/AndroidRuntime(5953): FATAL EXCEPTION: main
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): java.lang.NullPointerException
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at com.android.showapp.Shows$getAllData.onPostExecute(Shows.java:112)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at com.android.showapp.Shows$getAllData.onPostExecute(Shows.java:1)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at android.os.AsyncTask.finish(AsyncTask.java:417)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at android.os.AsyncTask.access$300(AsyncTask.java:127)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at android.os.Looper.loop(Looper.java:144)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at android.app.ActivityThread.main(ActivityThread.java:4937)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at java.lang.reflect.Method.invokeNative(Native Method)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at java.lang.reflect.Method.invoke(Method.java:521)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-05 11:02:32.729: ERROR/AndroidRuntime(5953): at dalvik.system.NativeStart.main(Native Method)
R.layout.icon does exist (and it holds the textview and imageview)
答案 0 :(得分:0)
您正在尝试通过光标访问记录,然后才能指向记录。失败的代码很可能是newView覆盖中此代码段的第二行。
int nameCol = c.getColumnIndex("show_title");
String name = c.getString(nameCol);
TextView tv = (TextView) v.findViewById(R.id.textView1);
if (name != null) {
Log.e("GRIDVIEW", "I'm in here");
tv.setText(name);
}
您不得尝试从bindView以外的游标访问字段值。
您应该能够在适配器的contstructor中获取列索引,并将它们存储为字段,以便以后在bindView中使用。
newView只应用于创建视图。
答案 1 :(得分:0)
答案来自Herrmann--无需在我的适配器中引用上下文和光标