SwipeRefreshLayout - 试图在空对象引用上调用虚拟方法

5

我将尝试使用SwipeRefreshLayout实现下拉刷新ListFragment内容的功能。

我的代码如下:

 public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    SwipeRefreshLayout srl = (SwipeRefreshLayout) view.findViewById(R.id.srl);
    srl.setOnRefreshListener(this);
}

我的XML文件是

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/srl"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</android.support.v4.widget.SwipeRefreshLayout>

但我总是遇到错误。
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.widget.SwipeRefreshLayout.setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout$OnRefreshListener)' on a null object reference
        at info.androidhive.slidingmenu.fragments.EventsOverview_pull.onViewCreated(EventsOverview_pull.java:32)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:961)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:211)
        at android.app.ActivityThread.main(ActivityThread.java:5321)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

看起来view.findViewById(R.id.srl)返回了null。

有人知道出了什么问题吗?

编辑:

我的OnCreateView方法

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    View rootView = inflater.inflate(R.layout.pulldown, container, false);


    return rootView;
}

现在我遇到了这个错误。
java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
        at android.support.v4.app.ListFragment.ensureList(ListFragment.java:344)
        at android.support.v4.app.ListFragment.onViewCreated(ListFragment.java:145)
        at info.androidhive.slidingmenu.fragments.EventsOverview_pull.onViewCreated(EventsOverview_pull.java:29)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:961)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:211)
        at android.app.ActivityThread.main(ActivityThread.java:5321)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

清理你的项目并重新构建所有内容。如果在源代码级别一切看起来都没问题,那么可能是编译出现了不同步的情况。 - Greg Hewgill
1
请发布您的onCreateView - SilentKnight
如果您真的在使用ListFragment,那么您的ListView必须具有id android.R.id.list。其次,您必须在onCreateView中填充并返回自定义布局。 - Eugen Pechanec
1
在布局XML文件中将ListView的ID更改为android:id="@android:id/list" - Amrut Bidri
1
异常信息已经明确了问题所在: “您的内容必须拥有一个id属性为'android.R.id.list'的ListView”。 - Xaver Kapeller
2个回答

6
不要将SwipeRefreshLayout作为父布局。这样使用是可以的。 像这样使用:
  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/srl"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff" >

  <android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/srl"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

对我来说它有效。 愉快的编码 :)


0

尝试把代码放到onActivityCreated(...)中而不是onViewCreated(..)


1
一些解释会有所帮助。 - Ian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接