3

尝试使用自定义适配器设置网格视图,我得到光标并在 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)
4

2 回答 2

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 以外的游标访问字段值。

您应该能够在适配器的构造函数中获取列索引并将它们存储为字段以供以后在 bindView 中使用。

newView 应该只用于创建视图。

于 2011-09-09T09:55:55.630 回答
0

答案来自 Herrmann - 不需要在我的适配器中引用上下文和光标

于 2012-01-26T21:52:51.500 回答