NullPointerException in cursor adapter

I have this error in my bindView() method. I have written a lot of adapters before, but now I don't understand the cause of this issue. So, I have a view pager and a ListFragment in one screen. This list populated from content provider through a ResourceCursorAdapter. The code:

public class CityFragment extends ListFragment implements LoaderCallbacks<Cursor>{

public final static int CITIES_LIST = 0;

CityAdapter adapter;

public static CityFragment newInstance() {
    CityFragment cityFragment = new CityFragment();
    return cityFragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.city_layout, container, false);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    adapter = new CityAdapter(getActivity(), 
            R.layout.city_row, 
            null, 
            CursorAdapter.FLAG_AUTO_REQUERY);
//      adapter = new SimpleCursorAdapter(getActivity().getApplicationContext(),
//              android.R.layout.simple_list_item_2,
//              null, 
//              new String[] {Schema.Cities.name,
Schema.Cities.activeCamerasCount}, 
//              new int[] {android.R.id.text1, android.R.id.text2});
    setListAdapter(adapter);

    getLoaderManager().initLoader(CITIES_LIST, null, this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
    return new CursorLoader(getActivity(), 
            CustomContentProvider.CITIES_URI, 
            new String[] { Schema.Cities._id, Schema.Cities.name, Schema.Cities.activeCamerasCount }, 
            null, 
            null,
            null);
}

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
    adapter.changeCursor(cursor);
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    adapter.changeCursor(null);
}
}

public class CityAdapter extends ResourceCursorAdapter {

private int cityIdx;
private int cameraIdx;

public CityAdapter(Context context, int layout, Cursor c, int flags) {
    super(context, layout, c, flags);
    initColumns(c);
}

@Override
public void changeCursor(Cursor cursor) {
    super.changeCursor(cursor);
    initColumns(cursor);
}

@Override
public void bindView(View v, Context ctx, Cursor c) {
    ViewHolder holder = (ViewHolder) v.getTag();
    holder.city.setText(c.getString(cityIdx));
    holder.camera.setText(c.getString(cameraIdx));
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = super.newView(context, cursor, parent);
//      LayoutInflater inflater = LayoutInflater.from(context);
//      View view = inflater.inflate(R.layout.city_row, parent, false);
    view.setTag(new ViewHolder(
            (TextView) view.findViewById(R.id.city), 
            (TextView) view.findViewById(R.id.cameras_count)));
    return view;
}

private void initColumns(final Cursor c) {
    if (c != null) {
        cityIdx = c.getColumnIndex(Schema.Cities.name);
        cameraIdx = c.getColumnIndex(Schema.Cities.camerasCount);
    }
}

private class ViewHolder {

    final TextView city;
    final TextView camera;

    public ViewHolder(final TextView city, final TextView camera) {
        this.city = city;
        this.camera = camera;
    }

}
}

    08-10 21:21:19.641: E/AndroidRuntime(414): java.lang.NullPointerException
08-10 21:21:19.641: E/AndroidRuntime(414):  at ru.viewcity.ui.CityAdapter.bindView(CityAdapter.java:34)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:256)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.AbsListView.obtainView(AbsListView.java:1430)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.ListView.makeAndAddView(ListView.java:1745)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.ListView.fillDown(ListView.java:670)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.ListView.fillFromTop(ListView.java:727)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.ListView.layoutChildren(ListView.java:1598)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.AbsListView.onLayout(AbsListView.java:1260)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.View.layout(View.java:7175)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.View.layout(View.java:7175)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.View.layout(View.java:7175)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1141)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.View.layout(View.java:7175)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.View.layout(View.java:7175)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.View.layout(View.java:7175)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.View.layout(View.java:7175)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.View.layout(View.java:7175)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.os.Looper.loop(Looper.java:123)
08-10 21:21:19.641: E/AndroidRuntime(414):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-10 21:21:19.641: E/AndroidRuntime(414):  at java.lang.reflect.Method.invokeNative(Native Method)
08-10 21:21:19.641: E/AndroidRuntime(414):  at java.lang.reflect.Method.invoke(Method.java:507)
08-10 21:21:19.641: E/AndroidRuntime(414):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-10 21:21:19.641: E/AndroidRuntime(414):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-10 21:21:19.641: E/AndroidRuntime(414):  at dalvik.system.NativeStart.main(Native Method)

In code you can see that I also try to use a SimpleCursorAdapter - it works well. In debug mode I see that in newView() method all TextView are set correctly but in bindView() these TextViews don't exist - they are null.

How can I resolve this?

Upvotes: 0

Views: 1149

Answers (1)

grv_9098
grv_9098

Reputation: 465

Just debug and check the running flow may be you trying to setText() of TextView before finding it (finViewById) may be that's why you getting null text view .

Upvotes: 2

Related Questions