NullPointerException с SimpleCursorAdapter - PullRequest
3 голосов
/ 05 июля 2011

Пытаясь настроить сетку с помощью специального адаптера, я получаю курсор и устанавливаю адаптер в 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 голосов
/ 27 января 2012

Ответ был от Херрманна - мне не нужна ссылка на контекст и курсор в моем адаптере

0 голосов
/ 09 сентября 2011

Вы пытаетесь получить доступ к записям с помощью курсора, прежде чем он указывает на запись. Сбой кода, скорее всего, является второй строкой этого фрагмента из переопределения 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.

Вы должны иметь возможность получить индексы столбцов в конструкторе адаптера и сохранить их как поля для последующего использования в bindView.

newView следует использовать только для создания представления.

...