RecyclerView适配器中的LayoutInflater

时间:2018-04-10 08:54:00

标签: android android-layout android-recyclerview recycler-adapter

我试图在回收器视图适配器中创建一个弹出窗口,以便在用户单击回收器视图的项目时显示一个小菜单。 这是弹出功能:

public void Popup(final int id) {
        AlertDialog.Builder rBuilder = new AlertDialog.Builder(context);
        LayoutInflater i = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View rView = i.inflate(R.layout.comment_setting_popup, null);
    rBuilder.setView(rView);
        dialog = rBuilder.create();
        dialog.show();
    }

我在适配器的onBindViewHolder中调用此函数。 这段代码在一个适配器中工作正常但在另一个适配器中它总是向我显示相同的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.ayhemprod.jokesbox, PID: 4939
                  android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
                      at android.view.ViewRootImpl.setView(ViewRootImpl.java:765)
                      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
                      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
                      at android.app.Dialog.show(Dialog.java:330)
                      at com.ayhemprod.jokesbox.Adapters.AddShowCommentsAdapter.signalePopup(AddShowCommentsAdapter.java:295)
                      at com.ayhemprod.jokesbox.Adapters.AddShowCommentsAdapter$1.onClick(AddShowCommentsAdapter.java:71)
                      at android.view.View.performClick(View.java:6294)
                      at android.view.View$PerformClick.run(View.java:24770)
                      at android.os.Handler.handleCallback(Handler.java:790)
                      at android.os.Handler.dispatchMessage(Handler.java:99)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6494)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我尝试了一些解决方案,我在stackoverflow中找到但没有任何帮助,我无法找到问题的根源,特别是相同的代码在同一个项目的另一个适配器中工作。

更新 这是onBindViewHolder的代码:

public void onBindViewHolder(AddShowCommentsAdapter.MyViewHolder holder, final int position) {
        Comment c = commentsList.get(position);
holder.comment_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signalePopup(commentsList.get(position).getId());
            }
        });
}

我正在获取上下文抛出适配器构造函数,当我从activity调用适配器时,我将getApplicationContext添加为参数。

public AddShowCommentsAdapter(List<Comment> commentsList, Context context) {
        this.context = context;
        this.commentsList = commentsList;
    }

2 个答案:

答案 0 :(得分:1)

如果是AlertDialog,您应该使用Activity作为Context而不是getApplicationContext()

您可以在此处找到更多详细信息: Why does AlertDialog.Builder(Context context) only accepts Activity as a parameter?

在这里: Dialog throwing "Unable to add window — token null is not for an application” with getApplication() as context

答案 1 :(得分:0)

不是在Adapter类中编写弹出函数,而是在Fragment / Activity类中写入,其中适配器对象附加到recyclerview。

通过编写接口,将用户点击事件从Adapter类委托给相应的Activity / Fragment。从界面

的回调函数调用Popup函数