Trying to set up a gridview with a custom adapter, I get my cursor and set the adapter in ASyncTask...
Here is my code for it all:
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();
}
}
And here is my Adapter...
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);
}
}
I realize its a little messy and not the best but it should be working... here are my errors:
> 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)
You are trying to access records via the cursor before it is pointing to a record. The code that is failing is most likely the second line of this snippet from your newView override.
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);
}
You must not try to access field values from a cursor other than in bindView.
You should be able to get the column indexes in the contstructor of the adapter and store them as fields for later use in bindView.
newView should only be used to create a view.
Answer was from Herrmann - no need for a reference to the context and the cursor in my adapter
来源:https://stackoverflow.com/questions/6587052/nullpointerexception-with-simplecursoradapter