子类 SwipeRefreshLayout 在刷新时抛出 NullpointerException

Subclassed SwipeRefreshLayout throws NullpointerException on refresh

我现在找了一个星期,还没有找到合适的答案。

我得到了一个带有 OnRefreshListener 的 Subclassed SwipeRefreshLayout。初始化工作正常(至少看起来是这样),我的监听器被添加到我的自定义 SwipeRefreshLayout。

public class Status extends Activity {

private TableLayout tl;
private Context c;
private getValuesTask task;
private NewRefresh srl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_status);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
    srl = new NewRefresh(findViewById(R.id.swipe_container).getContext());
    srl.setView((ScrollView) findViewById(R.id.status_scroll_view));
    srl.setOnRefreshListener(new OnRefreshListener() {

        @Override
        public void onRefresh() {
            buildTable();
        }

    });

    tl = (TableLayout) findViewById(R.id.status_table);
    tl.setGravity(Gravity.CENTER_HORIZONTAL);
    c = this;
}
...

我的自定义 SwipeRefreshLayout 如下所示:

protected class NewRefresh extends SwipeRefreshLayout{
    private ScrollView childView;

    public NewRefresh(Context context) {
        super(context);
    }

    public NewRefresh(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setView(ScrollView temp) {
        childView = temp;
    }

    @Override
    public boolean canChildScrollUp() {
        if(childView != null) {
            return childView.canScrollVertically(-1);
        }
        return super.canChildScrollUp();
    }

}

buildMethod() class 是一个 AsyncTask。 当我向下滑动时,出现此异常:

FATAL EXCEPTION: main
Process: de.storno.wortspielkasse, PID: 1222
java.lang.NullPointerException: Attempt to invoke interface method 'void android.support.v4.widget.SwipeRefreshLayout$OnRefreshListener.onRefresh()' on a null object reference
at android.support.v4.widget.SwipeRefreshLayout.startRefresh(SwipeRefreshLayout.java:530)
at android.support.v4.widget.SwipeRefreshLayout.onTouchEvent(SwipeRefreshLayout.java:484)
at android.view.View.dispatchTouchEvent(View.java:8388)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2424)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2158)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2314)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1692)
at android.app.Activity.dispatchTouchEvent(Activity.java:2739)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2275)
at android.view.View.dispatchPointerEvent(View.java:8578)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4021)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3887)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5701)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5675)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5646)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5791)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5762)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5814)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:548)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
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:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我几乎要实现一个按钮来刷新我的 activity,但这不是我想要的工作方式。

完成我的 activity 布局:

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

    <RelativeLayout... >

        <TextView ... />

        <ScrollView ... >
            <TableLayout
                ... >
            </TableLayout>
        </ScrollView>

        <Button... />

    </RelativeLayout>

提前致谢

那是因为您没有在 SwipeRefreshLayout 上设置 onRefreshListener。您必须更改以下内容。一、布局:

来自

   <android.support.v4.widget.SwipeRefreshLayout 

  <your.pahat.to.newrefresh.NewRefresh

二瘦,在你activity

变化
srl = new NewRefresh(findViewById(R.id.swipe_container).getContext());
srl.setView((ScrollView) findViewById(R.id.status_scroll_view));

 srl = (NewRefresh) findViewById(R.id.swipe_container);

其他的我觉得还不错