【问题标题】:Android : RecyclerView adapter doesn't load data after Permission CheckAndroid:RecyclerView 适配器在权限检查后不加载数据
【发布时间】:2017-11-09 03:30:22
【问题描述】:

RecyclerView 适配器在权限检查后首次启动时不加载数据。我必须重新点击选项卡才能获取数据。

我已经访问过/尝试过这些链接 -

-- RecyclerView doesn't load data in first launch using FirebaseRecyclerAdapter

-- RecyclerView doesn't load items on first start of activity

这是代码 -

onCreateView -

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_third, container, false);

recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);

if (checkAndRequestPermissions()) {
    loadAudio();
}

return view;
}

onRequestPermissionResult -

loadAudio() //  call to method if permission granted

loadAudio() -

private void loadAudio() {
ContentResolver contentResolver = getActivity().getContentResolver();
... /** accessing contents */ ...

   if (cursor != null) {
        cursor.close();
      }
  initRecyclerView();
 }

initRecyclerView -

private void initRecyclerView() {

// To check if this method called at first time tab click
// which it doesn't.
System.out.println("==== mAudioList ==="+mAudioList+"::");
// ------

if (mAudioList != null && mAudioList.size() > 0) {
    AudioAdapter adapter = new AudioAdapter(mAudioList, getActivity());
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    DIviderItemDecoration dividerItemDecoration = new DIviderItemDecoration(getContext(), linearLayoutManager.getOrientation());
    recyclerView.addItemDecoration(dividerItemDecoration);

    // thought this would help
    adapter.notifyDataSetChanged();

    recyclerView.setAdapter(adapter);
}
}

onRequestPermissionResult -

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {

    String TAG = "LOG_PERMISSION";
    Log.d(TAG, "Permission callback called-------");
    switch (requestCode) {
        case REQUEST_ID_MULTIPLE_PERMISSIONS: {

            Map<String, Integer> perms = new HashMap<>();
            // Initialize the map with both permissions
            perms.put(Manifest.permission.READ_PHONE_STATE, PackageManager.PERMISSION_GRANTED);
            perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
            // Fill with actual results from user
            if (grantResults.length > 0) {
                for (int i = 0; i < permissions.length; i++)
                    perms.put(permissions[i], grantResults[i]);
                // Check for both permissions

                if (perms.get(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
                        ) {
                    Log.d(TAG, "Phone state and storage permissions granted");
                    loadAudio();
                } else {
                    Log.d(TAG, "Some permissions are not granted ask again ");
                    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) ||
                            ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_PHONE_STATE)) {
                        showDialogOK("Phone state and storage permissions required for this app",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        switch (which) {
                                            case DialogInterface.BUTTON_POSITIVE:
                                                checkAndRequestPermissions();
                                                break;
                                            case DialogInterface.BUTTON_NEGATIVE:
                                                // proceed with logic by disabling the related features or quit the app.
                                                break;
                                        }
                                    }
                                });
                    }
                    else {
                        Toast.makeText(getContext(), "Go to settings and enable permissions", Toast.LENGTH_LONG)
                                .show();
                    }
                }
            }
        }
    }

}

我不知道如何解决这个问题。请,任何帮助将不胜感激。 已经在这里问过这个问题 - question 但这没有用。

注意:我的其他片段生命周期方法中没有代码。

【问题讨论】:

  • 你试过调试你是否在mAudioList中获取数据?
  • 如果您请求权限,您需要在您的活动中处理回调public void onRequestPermissionsResult - 我假设如果您在授予权限后重新启动应用程序,如果loadAudio() 正确,则将按预期工作。
  • @Pavan 是的!但只有在第二个标签点击之后!不是在第一个选项卡单击期间。在第一次之后它就完美地工作了!
  • 第一次尝试时出现什么错误日志,你在哪里请求许可,正如提到的标记
  • 没有错误日志!甚至 initRecyclerView 中的 sysout 也没有被执行。

标签: android android-fragments android-recyclerview


【解决方案1】:

终于!我得到了答案。 问题不在于权限,而在于 onRequestPermissionResult,因为它没有得到回调!

这个answer 帮助了我。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(/**fragmentContainer*/);
    if (fragment != null) {
        fragment.onRequestPermissionsResult(requestCode&0xff, permissions, grantResults);
    }
}

虽然他们最初回答的是嵌套片段,但它也适用于顶级片段。 如果其他人有同样的问题,请检查一下。

请访问以上链接了解其工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2018-06-12
    • 2017-06-06
    • 2019-04-04
    • 2014-05-30
    相关资源
    最近更新 更多