2017-06-27 2 views
-1

Utilisation d'un tableau avec un adaptateur de base pour remplir une vue de liste. Il y a beaucoup de drawables facultatifs et ainsi un commutateur est très inefficace. J'ai essayé de mettre en place un système à deux doublure en utilisant getResources(). GetIdentifier(), mais toutes les tentatives ont échoué retour id ressources de 0 x 0000.Définition d'une ressource d'image pouvant être dessinée avec une chaîne programmatique

code de travail

  try { 
       final ImageView star = convertView.findViewById(R.id.star); 
       final JSONObject object = list.getJSONObject(i); 
       switch (object.getString("star")){ 
        case "a": 
         star.setImageResource(R.drawable.stara); 
         break; 
        case "b": 
         star.setImageResource(R.drawable.starb); 
         break; 
        case "c": 
         star.setImageResource(R.drawable.starc); 
         break; 
        case "d": 
         star.setImageResource(R.drawable.stard); 
         break; 
       } 

Je besoin de quelque chose en utilisant quelque chose comme cela, mais getIdentifier() méthode

final ImageView star = convertView.findViewById(R.id.star); 
star.setImageDrawable(getActivity().getResources().getDrawable(getActivity().getResources().getIdentifier("star" + object.getString("star") + ".png", "drawable", getActivity().getPackageName()))); 

"star" + object.getString ("étoile") + ".png" est le nom exact drawable dans le dossier des ressources (stara.png, starb.png, ....)

Je continue à obtenir cette exception avec la méthode getIdentifier()

No package identifier when getting value for resource number 0x00000000 

Comment mettre en œuvre correctement ceci ou une meilleure façon en utilisant une chaîne de programmation pour déterminer la ressource de nom drawable être mis à un imageview?

+0

Retirez '+ « .png »'. Vous ne spécifiez pas l'extension pour les ressources. –

Répondre

0

Vous devriez omettre le ".png". Si vous êtes à la recherche de « stara.png », ce que vous essayez d'obtenir est le idenfifier R.drawable.stara, donc ce que vous devriez avoir est

getActivity().getResources().getIdentifier("star" + object.getString("star"), "drawable", getActivity().getPackageName()))); 
+0

Merci! Sera acceptée réponse dans 9 minutes. Y a-t-il une approche plus efficace? –

+0

Eh bien, si vous avez vraiment besoin de mapper une valeur dans votre 'JSONObject' comme" a "à un drawable, je ne peux pas penser à d'autres options en plus du commutateur et en utilisant' getIdentifier'. Ce que je peux suggérer, cependant, ne traite pas directement d'un JSONObject. Utilisez votre 'List ' pour créer un 'List ' et cela devrait être ce que vous utilisez avec votre adaptateur. Pour chaque objet de modèle, il suffit de faire la conversion de la chaîne en ID dessinable une fois (dans le constructeur) et ensuite vous pouvez simplement renvoyer l'ID avec quelque chose comme 'public int getDrawableId()'. Ce sera plus efficace à la fin. –

+0

Vous pouvez également simplement utiliser une carte statique pour résoudre vos entiers dessinables à partir des clés fournies par JSONObject. – Submersed