回收站视图内的小吃店

时间:2019-11-28 05:07:38

标签: android android-recyclerview recycler-adapter

仅当没有“呼叫”权限时,我的逻辑才起作用。如果我提供了许可,它就可以正常工作。

我正在尝试在回收器视图中调用Snackbar,原因是我在回收器视图中的按钮之一必须调用Call工具。因此,我正在检查 Manifest.permission.CALL_PHONE 权限,如果没有提供权限,则会显示一个snakbar。在调用以下代码时

private void showSnackbar(MyViewHolder v , final int mainTextStringId, final int actionStringId,
                          View.OnClickListener listener) {
    Snackbar.make(v.snackBarLayout,
            context.getString(mainTextStringId),
            Snackbar.LENGTH_INDEFINITE)
            .setAction(context.getString(actionStringId), listener).show();
}
  

java.lang.IllegalArgumentException:从   给定的看法。请提供有效的视图。

但是我试图解析我的Viewholder表单

 @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
....
....
....
  showSnackbar(holder,R.string.permission_rationale, android.R.string.ok,
                                    new View.OnClickListener() {
                                        @Override
                                        public void onClick(View view) {
                                            // Request permission
                                            startCallPermissionRequest();
                                        }
                                    });
}

对建议的重复项做出回应

我不认为这是重复的问题,我尝试将快餐栏更改为findviewbyId,但无法获取要显示的视图。视图仅来自ViewHolder。

2 个答案:

答案 0 :(得分:2)

您正在将Holder作为Snackbar的父视图

 showSnackbar(holder,R.string.permission_rationale, android.R.string.ok,
                                new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        // Request permission
                                        startCallPermissionRequest();
                                    }
                                });

在与此适配器类连接的xml内,您需要父视图对象(LinearLayout / RelativeLayout或您提供的任何对象)来代替 holder

答案 1 :(得分:0)

最后,我能够解决它,问题在于获取父视图以使其正常工作 view.getRootView()

  private void showSnackbar(View v , final int mainTextStringId, final int actionStringId,
                              View.OnClickListener listener) {
        Snackbar.make(view.getRootView().findViewById(android.R.id.content),
                context.getString(mainTextStringId),
                Snackbar.LENGTH_INDEFINITE)
                .setAction(context.getString(actionStringId), listener).show();
    }