【问题标题】:Android - NullPointerException when trying to implement Adapter from FragmentAndroid - 尝试从 Fragment 实现适配器时出现 NullPointerException
【发布时间】:2014-08-22 16:37:53
【问题描述】:

我正在加载一个Fragment,然后Fragment 创建一个AdapterAdapter 有一个 interface。加载implementsAdapter 的片段。 我发起mCallback时没有错误。

这是适配器中的代码:

Scanlist mScanlist; 
ScanlistListener mCallback;

public Scanadapter(Activity a, ArrayList<Scanmodel> d, Resources resLocal){
    mActivity = a;
    mData = d;
    res = resLocal;
    sInflater = (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mScanlist = (Scanlist) mActivity.getFragmentManager().findFragmentById(R.layout.scanlist);
    try {
        mCallback = (ScanlistListener) mScanlist;
        Log.v(TAG, String.valueOf(mCallback)+ " here");
    } catch (ClassCastException e) {
        throw new ClassCastException(mScanlist.toString()
                + " must implement ScanlistListener");
    }
}

private class OnItemClickListener implements OnClickListener{
    private int mPosition;
    OnItemClickListener(int position){
        mPosition = position;
    }
    @Override
    public void onClick(View v) {
        mCallback.scanlistclick(v, mPosition);
    }
}

public interface ScanlistListener{
    public void scanlistclick(View v, int i);
}

当我点击列表中的一个项目时,我得到一个NullPointerException,但try statement 没有给出error exception 启动mCallback 变量。

08-22 10:19:09.099: E/AndroidRuntime(8112): java.lang.NullPointerException
08-22 10:19:09.099: E/AndroidRuntime(8112):     at net.xxxxx.adapter.Scanadapter$OnItemClickListener.onClick(Scanadapter.java:140)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at android.view.View.performClick(View.java:4489)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at android.view.View$PerformClick.run(View.java:18803)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at android.os.Handler.handleCallback(Handler.java:730)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at android.os.Looper.loop(Looper.java:137)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at android.app.ActivityThread.main(ActivityThread.java:5455)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at java.lang.reflect.Method.invokeNative(Native Method)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at java.lang.reflect.Method.invoke(Method.java:525)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
08-22 10:19:09.099: E/AndroidRuntime(8112):     at dalvik.system.NativeStart.main(Native Method)

我做错了什么?

【问题讨论】:

    标签: android android-fragments implementation android-adapter baseadapter


    【解决方案1】:

    如果您的 findFragmentByID 没有找到它正在寻找的布局元素,它将返回 null。然后将 null 分配给 mCallback。使用强制转换分配 null 不会触发异常。也许使用调试器单步执行您的代码,并确保您的视图被找到并且 mCallback 未设置为 null。

    【讨论】:

    • 是的,mCallback 设置为 null,我该如何设置 mCallback?
    • 在调用 findFragmentByID 之前您的片段布局是否被夸大了?
    • 我更新了我的问题中的方法,所以告诉你我在哪里启动 Inflater
    • 我从片段中发送了适配器this,您的回答让我走上了正确的道路
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多