游标适配器中的NullPointerException

时间:2012-08-10 04:33:26

标签: android fragment

我的bindView()方法中出现此错误。我以前写了很多适配器,但现在我不明白这个问题的原因。 所以,我在一个屏幕上有一个view pager和一个ListFragment。此列表通过ResourceCursorAdapter从内容提供程序填充。代码:

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)

在代码中,您可以看到我也尝试使用SimpleCursorAdapter - 它运行良好。在调试模式中,我看到在newView()方法中所有TextView都设置正确,但在bindView()中,这些TextView不存在 - 它们为空。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

只需调试并检查正在运行的流程,您可能是在尝试使用TextView的setText()之前找到它(finViewById),这可能是您获取空文本视图的原因。