ejemplo custom android gridview nullpointerexception simplecursoradapter

custom - autocompletetextview android ejemplo



NullPointerException con SimpleCursorAdapter (2)

Está intentando acceder a los registros mediante el cursor antes de apuntar a un registro. El código que está fallando es probablemente la segunda línea de este fragmento de su nueva anulación de Vista.

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); }

No debe intentar acceder a los valores de campo desde un cursor que no sea en bindView.

Debería poder obtener los índices de columna en el contstructor del adaptador y almacenarlos como campos para su uso posterior en bindView.

newView solo debe usarse para crear una vista.

Al intentar configurar una vista de cuadrícula con un adaptador personalizado, obtengo mi cursor y configuro el adaptador en ASyncTask ...

Aquí está mi código para todo:

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(); } }

Y aquí está mi adaptador ...

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); } }

Me doy cuenta de que es un poco desordenado y no es el mejor, pero debería estar funcionando ... aquí están mis errores:

> 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)


La respuesta fue de Herrmann: no es necesario hacer una referencia al contexto y el cursor en mi adaptador