首页 > 解决方案 > 将带有 RecyclerView Holder 的数组传递给 Alertdialog

问题描述

我正在编写一个可扩展的回收器视图,其中代码与通常的回收器视图略有不同。我的代码中的 bind 方法是在 ViewHolder 中定义的。一切似乎都写得正确,我不明白我的错误是什么。我将数组从 RecyclerView 传递给 AlertDialog 但由于某种原因应用程序崩溃了。这是我的 View Holder 的代码,其中显示了错误字符串:

public class AnalysisViewHolder extends ChildViewHolder {
    HtmlTextView textView;
    FrameLayout frame;
    Context c;
public AnalysisViewHolder(View itemView) {
    super(itemView);
    textView = itemView.findViewById(R.id.text_rc);
    frame = itemView.findViewById(R.id.frame);
}
public void bind(final Analysys analysys){
    textView.setHtml(analysys.name);
    frame.setOnClickListener(new View.OnClickListener() {// here
        @Override
        public void onClick(View v) {
            AlertDialog.Builder aa = new AlertDialog.Builder(c);
            aa.setTitle(analysys.name);
            aa.setMessage(Html.fromHtml(analysys.analysis));
            aa.setNegativeButton(c.getString(R.string.back), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
        }
    });

}

Мy 堆栈跟踪:

2019-08-29 22:06:45.494 29861-29861/com.vn.iambulance.prototype_20 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.vn.iambulance.prototype_20, PID: 29861
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
        at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:224)
        at android.app.AlertDialog$Builder.<init>(AlertDialog.java:474)
        at com.vn.iambulance.prototype_20.adapter_analysis.AnalysisViewHolder.bind(AnalysisViewHolder.java:28)
        at com.vn.iambulance.prototype_20.adapter_analysis.AnalysisAdapter.onBindChildViewHolder(AnalysisAdapter.java:36)
        at com.vn.iambulance.prototype_20.adapter_analysis.AnalysisAdapter.onBindChildViewHolder(AnalysisAdapter.java:13)
        at com.thoughtbot.expandablerecyclerview.ExpandableRecyclerViewAdapter.onBindViewHolder(ExpandableRecyclerViewAdapter.java:82)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
        at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
        at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
        at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:1041)
2019-08-29 22:06:45.495 29861-29861/com.vn.iambulance.prototype_20 E/AndroidRuntime:     at android.view.View.layout(View.java:22406)
        at android.view.ViewGroup.layout(ViewGroup.java:6584)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3380)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2849)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1897)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8514)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7076)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

标签: androidarraysandroid-recyclerviewandroid-alertdialog

解决方案


你的错误是这样的: -

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference

我问你。你解决了吗...

AlertDialog.Builder aa = new AlertDialog.Builder(c);

你的正确路线在这里...

AlertDialog.Builder aa = new AlertDialog.Builder(context);

在您的项目要求中为适配器创建活动内的构造函数。在活动或适配器上下文中声明,这个问题解决了......


推荐阅读