Android: Просмотр возвращается ноль - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь получить контакты и показать их в списке.Я использую RxPermissions для этого.Проблема здесь заключается в том, что когда я впервые разрешаю разрешение, представление возвращает нулевое значение и показывает пустой список, даже если в списке есть элементы.Но когда я возвращаюсь к предыдущему занятию и возвращаюсь, все работает нормально.

ContactsFragment.kt

override fun onResume() {
        super.onResume()
        if (isPermissionGranted) {
            Timber.d("Permission is granted")
            contactsPresenter.fetchContacts(context)
            noPermissionsWarning.visibility = View.GONE
        } else {
            noPermissionsWarning.visibility = View.VISIBLE
            showContactList(ArrayList()) // Show empty list when permissions not granted
        }
    }
private fun askPermissions() {
    rxPermissions
            .request(android.Manifest.permission.GET_ACCOUNTS,
                    android.Manifest.permission.READ_CONTACTS,
                    android.Manifest.permission.WRITE_CONTACTS)
            .subscribe { permissionGranted ->
                isPermissionGranted = permissionGranted
            }
}



override fun showContactList(selectedContacts: ArrayList<Contact>) {
        contactAdapter = ContactListAdapter(selectedContacts, this, context)
        val layoutManager = LinearLayoutManager(this.context)
        contactsRecyclerView?.layoutManager = layoutManager
        contactsRecyclerView?.addItemDecoration(DividerItemDecoration(
                contactsRecyclerView?.context,
                DividerItemDecoration.VERTICAL
        ))
        contactsRecyclerView?.adapter = contactAdapter
    }

ContactsPresenter.kt

override fun takeView(view: ContactsContract.View, context: Context?) {
        super.takeView(view)
        contactList.clear()
        tempContactList.clear()
    }

    override fun fetchContacts(context: Context?) {
        contactManager.getContacts(context)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    it.let {
                        tempContactList.addAll(it.sortedWith(compareBy { it.userName }))
                        contactList.addAll(it.sortedWith(compareBy { it.userName }))
                        view?.showContactList(contactList)// this view is null at first
                    }
                }, {

                }).addDisposableTo(disposable)
    }

Чего бы мне здесь не хватало.

Спасибо

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Похоже, вы должны получать ваши контакты сразу после этой строки:

isPermissionGranted = permissionGranted
1 голос
/ 14 марта 2019

вызовите свой метод, когда вы проверяете, предоставлено разрешение или нет

 if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == 
                      PackageManager.PERMISSION_GRANTED) {
Filtering filtering=new Filtering();
//contactFetch method  here
    } else {         

     Permission.requestStoragePermission(MainActivity.this,
                    STORAGE_PERMISSION_CODE);
    }

После этого, когда вы запрашиваете разрешение ......

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == STORAGE_PERMISSION_CODE)  {
        if (grantResults.length > 0 && grantResults[0] == 
                   PackageManager.PERMISSION_GRANTED) {
            Filtering filtering=new Filtering();
            //Again your fetching method
        } else {
            Toast.makeText(this, "Permission DENIED", Toast.LENGTH_SHORT).show();
            Permission.requestStoragePermission(MainActivity.this,
                                  STORAGE_PERMISSION_CODE);
        }
    }
}

Попробуйте это яне уверен, но я думаю, что это поможет вам

0 голосов
/ 14 марта 2019

Я решил это, прикрепив вид как внутри onResume(), так и onViewCreated(). Спасибо всем за помощь

  • Спустя довольно долгое время я понял, что я очищаю одноразовые вещи на onPause(), что должно было быть сделано внутри onDestroy() в моем случае. Я написал решение на случай, если оно кому-нибудь поможет
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...