使用SimpleCursorAdapter的NullPointerException

时间:2011-07-05 18:17:34

标签: android gridview nullpointerexception simplecursoradapter

尝试使用自定义适配器设置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)

2 个答案:

答案 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--无需在我的适配器中引用上下文和光标