为什么我使用 StickyGridHeaders 库得到 NullPointerException,而其他人使用同一个库就好了?

Why am I getting a NullPointerException using StickyGridHeaders library, while others are using the same library just fine?

我在 StickyGridHeaders library, while others (this) and (this 中得到一个 NullPointerException) 似乎正在使用它,没有这个例外。

我可能还应该提到我在我的项目中添加了库的 .jar 文件,因为我使用 Eclipse(而不是 Android Studio)。

我该如何解决这个问题?

部分Logcat:

...
06-24 08:42:22.419: E/AndroidRuntime(1495): FATAL EXCEPTION: main
06-24 08:42:22.419: E/AndroidRuntime(1495): java.lang.NullPointerException
06-24 08:42:22.419: E/AndroidRuntime(1495):     at com.tonicartos.widget.stickygridheaders.StickyGridHeadersSimpleArrayAdapter.getHeaderView(StickyGridHeadersSimpleArrayAdapter.java:93)
...

SSCCE:

MainActivity.java:

public class MainActivity extends Activity {
    private static final String TAG = MainActivity.class.getSimpleName();

    private StickyGridHeadersGridView mainGridView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        mainGridView = (StickyGridHeadersGridView) findViewById(R.id.mainActivity_gridView);

        final String[] dataArray = {
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G",
                "H",
                "I",
                "J",
        };

        StickyGridHeadersSimpleArrayAdapter<String> stickyGridHeadersSimpleAdapter = 
                new StickyGridHeadersSimpleArrayAdapter<String>(
                getApplicationContext(), dataArray, R.layout.header,
                R.layout.item);
        mainGridView.setAdapter(stickyGridHeadersSimpleAdapter);

        mainGridView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.i(TAG, "Item labelled " + dataArray[position] + "clicked.");
            }
        });

    }
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <com.tonicartos.widget.stickygridheaders.StickyGridHeadersGridView android:id="@+id/mainActivity_gridView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center_horizontal"
            android:background="#90000000"
            android:gravity="center"
            android:horizontalSpacing="10dp"
            android:verticalSpacing="10dp"
            android:numColumns="4"
            android:stretchMode="columnWidth" />

</RelativeLayout>

header.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:textColor="#fff" />


    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#ff33b5e5" >
    </FrameLayout>

</LinearLayout>

item.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:padding="10dp"
    android:textColor="#fff" />

编辑:

06-24 08:42:22.415: W/dalvikvm(1495): threadid=1: thread exiting with uncaught exception (group=0xa62ad288)
06-24 08:42:22.419: E/AndroidRuntime(1495): FATAL EXCEPTION: main
06-24 08:42:22.419: E/AndroidRuntime(1495): java.lang.NullPointerException
06-24 08:42:22.419: E/AndroidRuntime(1495):     at com.tonicartos.widget.stickygridheaders.StickyGridHeadersSimpleArrayAdapter.getHeaderView(StickyGridHeadersSimpleArrayAdapter.java:93)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at com.tonicartos.widget.stickygridheaders.StickyGridHeadersSimpleAdapterWrapper.getHeaderView(StickyGridHeadersSimpleAdapterWrapper.java:57)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at com.tonicartos.widget.stickygridheaders.StickyGridHeadersBaseAdapterWrapper.getView(StickyGridHeadersBaseAdapterWrapper.java:172)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.AbsListView.obtainView(AbsListView.java:2267)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.GridView.onMeasure(GridView.java:1030)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at com.tonicartos.widget.stickygridheaders.StickyGridHeadersGridView.onMeasure(StickyGridHeadersGridView.java:822)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.View.measure(View.java:15172)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:617)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:399)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.View.measure(View.java:15172)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.View.measure(View.java:15172)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.View.measure(View.java:15172)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.View.measure(View.java:15172)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.Choreographer.doFrame(Choreographer.java:525)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.os.Handler.handleCallback(Handler.java:615)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.os.Looper.loop(Looper.java:137)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at android.app.ActivityThread.main(ActivityThread.java:4745)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at java.lang.reflect.Method.invokeNative(Native Method)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at java.lang.reflect.Method.invoke(Method.java:511)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-24 08:42:22.419: E/AndroidRuntime(1495):     at dalvik.system.NativeStart.main(Native Method)
06-24 08:47:22.611: I/Process(1495): Sending signal. PID: 1495 SIG: 9

我刚刚让它在 Eclipse 中运行。这是我所做的:

  1. 在 Eclipse 中创建一个名为 StickyGridHeaders 的新项目。使它成为 库项目并打包 com.tonicartos.widget.stickygridheaders 在里面。不创造 任意 Activity.
  2. 在包中创建六个class,并给它们取相同的名字 classes here.
  3. 的名字
  4. 打开每个 classes here 并将代码复制到 在您的 Eclipse 库项目中对应 class。保存它们。
  5. 现在,在您实际的 SSCCE 项目中,在 header.xmlitem.xml 中, 在 TextView 元素中,添加 android:id="@android:id/item1" 属性。感谢 Mike M. 对这一步的评论。
  6. 从您的 SSCCE 项目中,删除您拥有的库的 .jar 文件 之前包括在内。
  7. 在您的 SSCCE 项目中,像您一样添加此项目 从您的工作区添加任何其他项目。

原因:

在您的堆栈跟踪中,提到了 StickyGridHeadersSimpleArrayAdapter 的第 93 行,但该行在 class 的 Github 版本中是空白的。根据getView()方法提到了StickyGridHeadersBaseAdapterWrapper的第172行,但这行在getItemViewType()方法中,也没有调用getView()

所以我得出结论,.jar 是该项目的先前版本..