2

J'ai un recyclerView qui fonctionne comme une vue de liste élargie comme comme ceci:Ajout d'icône dans Android RecyclerView

enter image description here

enter image description here

enter image description here

Je veux ajouter une icône à chaque seconde enfant (éléments enfants générés dynamiquement) de chaque en-tête..qui j'ai mentionné dans l'image avec un cercle rouge.

Voici ma classe d'adaptateur.

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    public static final int HEADER = 0; 
    public static final int CHILD = 1; 

    private List<Item> data; 

    public ExpandableListAdapter(List<Item> data) { 
     this.data = data; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) { 
     View view = null; 
     Context context = parent.getContext(); 
     float dp = context.getResources().getDisplayMetrics().density; 
     int subItemPaddingLeft = (int) (18 * dp); 
     int subItemPaddingTopAndBottom = (int) (5 * dp); 
     switch (type) { 
      case HEADER: 
       LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = inflater.inflate(R.layout.list_header, parent, false); 
       ListHeaderViewHolder header = new ListHeaderViewHolder(view); 
       return header; 
      case CHILD: 
       TextView itemTextView = new TextView(context); 
       itemTextView.setPadding(subItemPaddingLeft, subItemPaddingTopAndBottom, 0, subItemPaddingTopAndBottom); 
       itemTextView.setTextColor(0x88000000); 
       itemTextView.setLayoutParams(
         new ViewGroup.LayoutParams(
           ViewGroup.LayoutParams.MATCH_PARENT, 
           ViewGroup.LayoutParams.WRAP_CONTENT)); 
       return new RecyclerView.ViewHolder(itemTextView) { 
       }; 
     } 
     return null; 
    } 

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     final Item item = data.get(position); 
     switch (item.type) { 
      case HEADER: 
       final ListHeaderViewHolder itemController = (ListHeaderViewHolder) holder; 
       itemController.refferalItem = item; 
       itemController.header_title.setText(item.text); 
       if (item.invisibleChildren == null) { 
        itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus); 
       } else { 
        itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus); 
       } 
       itemController.btn_expand_toggle.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         if (item.invisibleChildren == null) { 
          item.invisibleChildren = new ArrayList<Item>(); 
          int count = 0; 
          int pos = data.indexOf(itemController.refferalItem); 
          while (data.size() > pos + 1 && data.get(pos + 1).type == CHILD) { 
           item.invisibleChildren.add(data.remove(pos + 1)); 
           count++; 
          } 
          notifyItemRangeRemoved(pos + 1, count); 
          itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus); 
         } else { 
          int pos = data.indexOf(itemController.refferalItem); 
          int index = pos + 1; 
          for (Item i : item.invisibleChildren) { 
           data.add(index, i); 
           index++; 
          } 
          notifyItemRangeInserted(pos + 1, index - pos - 1); 
          itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus); 
          item.invisibleChildren = null; 
         } 
        } 
       }); 
       break; 
      case CHILD: 
       TextView itemTextView = (TextView) holder.itemView; 
       itemTextView.setText(data.get(position).text); 
       break; 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return data.get(position).type; 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    private static class ListHeaderViewHolder extends RecyclerView.ViewHolder { 
     public TextView header_title; 
     public ImageView btn_expand_toggle; 
     public Item refferalItem; 

     public ListHeaderViewHolder(View itemView) { 
      super(itemView); 
      header_title = (TextView) itemView.findViewById(R.id.header_title); 
      btn_expand_toggle = (ImageView) itemView.findViewById(R.id.btn_expand_toggle); 
     } 
    } 

    public static class Item { 
     public int type; 
     public String text; 
     public List<Item> invisibleChildren; 

     public Item() { 
     } 

     public Item(int type, String text) { 
      this.type = type; 
      this.text = text; 
     } 
    } 
} 

Je suis incapable de changer cette classe d'adaptation selon mon exigence .Comment changer cette classe d'adaptateur pour permettre d'ajouter l'icône dans chaque deuxième enfant de chaque en-tête?

Remarque: Si d'autres informations sont nécessaires, veuillez demander.

+1

vous avez créer la mise en page de child.xml ressemblent comme « list_header.xml », utilisez ce xml dans onCreateViewHolder même que tête. – TejaDroid

Répondre

3

Si vous voulez rester avec TextViews créant dynamiquement, vous pouvez utiliser:

itemTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.your_drawable, 0); 

pour définir l'icône.

Si vous voulez avoir plus de contrôle sur la mise en page, je suggère d'utiliser l'approche similaire avec en-tête (en utilisant l'inflation de mise en page), par exemple:

LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

switch (type) { 
    case HEADER: 
     view = inflater.inflate(R.layout.list_header, parent, false); 
     ListHeaderViewHolder header = new ListHeaderViewHolder(view); 
     return header; 
    case CHILD: 
     view = inflater.inflate(R.layout.list_child, parent, false); 
     ListChildViewHolder child = new ListChildViewHolder(view); 
     return child; 
} 

Pour afficher l'icône que dans chaque deuxième enfant, dans votre onBindViewHolder ajouter:

itemController1.yourIcon.setVisibility((position % 2 == 0) ? View.VISIBLE : View.GONE); 
+0

Il a ajouté l'icône, mais, dans toute la liste des enfants .. Je veux ajouter l'icône seulement deuxième enfant de l'en-tête .. il est mon code changé .. – Adi

+0

http://pastebin.com/1RHF4zvT – Adi

+0

Ah désolé je n'ai pas remarqué cette exigence. Vous pouvez résoudre ceci avec ce qu'Alex Shutov a écrit ci-dessous: dans votre 'onBindViewHolder', ajoutez' itemController1.yourIcon.setVisibility ((position% 2 == 0)? View.VISIBLE: View.GONE); ' –