1
votes

Android: afficher le renvoi de null

J'essaie de récupérer des contacts et de les afficher dans une liste. J'utilise RxPermissions pour cela. Le problème ici est que lorsque j'autorise l'autorisation pour la première fois, la vue renvoie null et affiche une liste vide même si la liste contient des éléments. Mais quand je reviens à l'activité précédente et que je reviens, cela fonctionne bien.

ContactsFragment.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)
    }

ContactsPresenter.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
    }

Que manquerais-je ici.

Merci


2 commentaires

J'ai une réponse à cela en java mais le problème est que vous devez appeler votre méthode contactFetching aux deux endroits ..... 1. lorsque vous vérifiez si la permission est accordée si elle n'est pas autorisée d'appeler la méthode pour obtenir la permission et de mettre votre méthode de récupération ici peut-être que vous ne comprenez pas cela, alors veuillez me le demander


Maintenant, vérifiez la réponse ...


3 Réponses :


2
votes

Il semble que vous devriez récupérer vos contacts juste après cette ligne:

isPermissionGranted = permissionGranted


1 commentaires

C'était là au début en fait, mais sans succès.



0
votes

Je l'ai résolu en attachant la vue à la fois dans onResume () et onViewCreated () . Merci à tous pour l'aide

  • Après un certain temps, j'ai compris que je nettoyais le jetable sur onPause () , ce qui aurait dû être fait dans onDestroy () dans mon cas. J'ai écrit la solution au cas où cela aiderait quelqu'un

0 commentaires

1
votes

appelez votre méthode lorsque vous vérifiez l'autorisation accordée ou non

@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);
        }
    }
}

Ensuite, lorsque vous demandez l'autorisation ......

 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);
    }


0 commentaires