2016-01-13 4 views
0

J'ai une liste, Lorsque l'utilisateur clique sur un élément de cette liste trois boutons seront affichés sous cet élément (à savoir Oui, Non et Peut-être) afin que l'utilisateur puisse sélectionner l'un des boutons et que la réponse (comme 1,2,3 pour oui, non, peut-être) sera getView de l'adaptateur saved.In juste nous récupérons cette réponse et montrant imageView sur la ligne de tous les élément de la listeImageView d'un élément de la liste mélangé lors du défilement

l'image mise en getView

de ArrayAdapter
EventUserRelationMO eventUserRelationMO1 =new EventUserRelationMO(); 
        eventId1 = eventUserRelationMO1.getEventId(); 
        if (eventId1 == eventIdPosition) { 
         long eventUserId = eventUserRelationMO1.getEventUserId(); 

         int isAttending = eventUserRelationMO1.getIsAttending(); 
         if (isAttending == 1) { 
          holder.no.setVisibility(View.GONE); 
          holder.maybe.setVisibility(View.GONE); 
         } else if (isAttending == 2) { 
          holder.yes.setVisibility(View.GONE); 
          holder.maybe.setVisibility(View.GONE); 
         } else if (isAttending == 3) { 
          holder.yes.setVisibility(View.GONE); 
          holder.no.setVisibility(View.GONE); 
         } else { 
          holder.yes.setVisibility(View.GONE); 
          holder.no.setVisibility(View.GONE); 
          holder.maybe.setVisibility(View.GONE); 
         } 

        } 

c'est parfaitement fonctionne mais quand j'ai plus de nombre d'éléments dans la liste l'image n'est pas visible pour l'article correspondant/mélangé tout en faisant défiler

private class UserOccasions extends ArrayAdapter<EventMO> { 
     private ArrayList<EventMO> eventMOs; 
     LayoutInflater mInflater; 

     UserOccasions(Context context, int textViewResourceId, 
         ArrayList<EventMO> eventMOs) { 
      super(context, textViewResourceId, eventMOs); 
      this.eventMOs = new ArrayList<EventMO>(); 
      this.eventMOs.addAll(eventMOs); 
      mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     } 

     public class ViewHolder { 
      TextView eventNameTxtV; 
      TextView eventPlaceTxtV; 
      TextView sendByNameTxtv; 
      ImageView yes; 
      ImageView no; 
      ImageView maybe; 

     } 

     @Override 
     public int getCount() { 
      return eventMOs.size(); 
     } 

     /*@Override 
     public Object getItem(int position) { 
      return position; 
     }*/ 

     @Override 
     public long getItemId(int position) { 
      return 0; 
     } 

     // show list values name and mobile number in contact page 
     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      ViewHolder holder = null; 
      final EventMO eventMO = eventMOs.get(position); 
      if (null == convertView) { 
       convertView = mInflater.inflate(R.layout.invitation, null); 
       holder = new ViewHolder(); 
       holder.eventNameTxtV = (TextView) convertView.findViewById(R.id.invitationTitle); 
       holder.eventPlaceTxtV = (TextView) convertView.findViewById(R.id.invitationCheckBox); 
       holder.sendByNameTxtv = (TextView) convertView.findViewById(R.id.sendByName); 
       holder.yes = (ImageView) convertView.findViewById(R.id.yes); 
       holder.no = (ImageView) convertView.findViewById(R.id.no); 
       holder.maybe = (ImageView) convertView.findViewById(R.id.maybe); 

       eventUserRelationMOs = eventMO.getEventUserRelationBOs(); 
       sendUserMO = eventMO.getUserBO(); 
       eventIdPosition = eventMO.getEventId(); 


       for (EventUserRelationMO eventUserRelationMO1 : eventUserRelationMOs) { 
        eventId1 = eventUserRelationMO1.getEventId(); 
        if (eventId1 == eventIdPosition) { 
         long eventUserId = eventUserRelationMO1.getEventUserId(); 

         int isAttending = eventUserRelationMO1.getIsAttending(); 
         if (isAttending == 1) { 
          holder.no.setVisibility(View.GONE); 
          holder.maybe.setVisibility(View.GONE); 
         } else if (isAttending == 2) { 
          holder.yes.setVisibility(View.GONE); 
          holder.maybe.setVisibility(View.GONE); 
         } else if (isAttending == 3) { 
          holder.yes.setVisibility(View.GONE); 
          holder.no.setVisibility(View.GONE); 
         } else { 
          holder.yes.setVisibility(View.GONE); 
          holder.no.setVisibility(View.GONE); 
          holder.maybe.setVisibility(View.GONE); 
         } 

        } 
       } 
       convertView.setTag(holder); 

      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      holder.yes.setTag(eventMOs.get(position)); 
      holder.no.setTag(eventMOs.get(position)); 
      holder.maybe.setTag(eventMOs.get(position)); 

         holder.eventNameTxtV.setText(eventMOs.get(position).getText()); 
      holder.eventPlaceTxtV.setText(eventMOs.get(position).getPlace()); 
      holder.sendByNameTxtv.setText(sendUserMO.getUserName()); 

         View v = convertView.findViewById(R.id.invitation_single); 

      v.getRootView().setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent occasionAct = new Intent(InvitationFragment.this.getActivity(), InvitationActivity.class); 
        occasionAct.putExtra("eventMO", eventMO); 
        occasionAct.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(occasionAct); 

       } 

      }); 

      return convertView; 

     } 

c'est mon code complet de l'adaptateur quelqu'un me aider à maintenir imageView correspondante pour chaque élément de la liste lors du défilement

Répondre

0

ListView travaille en recyclant le views.To savoir plus sur la façon dont il fonctionne, vous pouvez avoir un coup d'oeil à ceci (http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/).

Le problème avec le code est que l'image est définie une seule fois lorsque convertView est null. Lorsque vous faites défiler la liste, la vue de liste passe une ligne recyclée dans la fonction getView (c'est-à-dire lorsque convertView ne sera pas nul). Dans ce cas, vous ne définissez pas ImageView.

J'ai modifié le code, cela devrait fonctionner

// show list values name and mobile number in contact page 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     final EventMO eventMO = eventMOs.get(position); 
     if (null == convertView) { 
      convertView = mInflater.inflate(R.layout.invitation, null); 
      holder = new ViewHolder(); 
      holder.eventNameTxtV = (TextView) convertView.findViewById(R.id.invitationTitle); 
      holder.eventPlaceTxtV = (TextView) convertView.findViewById(R.id.invitationCheckBox); 
      holder.sendByNameTxtv = (TextView) convertView.findViewById(R.id.sendByName); 
      holder.yes = (ImageView) convertView.findViewById(R.id.yes); 
      holder.no = (ImageView) convertView.findViewById(R.id.no); 
      holder.maybe = (ImageView) convertView.findViewById(R.id.maybe); 
      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 


     eventUserRelationMOs = eventMO.getEventUserRelationBOs(); 
     sendUserMO = eventMO.getUserBO(); 
     eventIdPosition = eventMO.getEventId(); 


     for (EventUserRelationMO eventUserRelationMO1 : eventUserRelationMOs) { 
      eventId1 = eventUserRelationMO1.getEventId(); 
      if (eventId1 == eventIdPosition) { 
       long eventUserId = eventUserRelationMO1.getEventUserId(); 

       int isAttending = eventUserRelationMO1.getIsAttending(); 
       if (isAttending == 1) { 
        holder.no.setVisibility(View.GONE); 
        holder.maybe.setVisibility(View.GONE); 
       } else if (isAttending == 2) { 
        holder.yes.setVisibility(View.GONE); 
        holder.maybe.setVisibility(View.GONE); 
       } else if (isAttending == 3) { 
        holder.yes.setVisibility(View.GONE); 
        holder.no.setVisibility(View.GONE); 
       } else { 
        holder.yes.setVisibility(View.GONE); 
        holder.no.setVisibility(View.GONE); 
        holder.maybe.setVisibility(View.GONE); 
       } 

      } 
     } 

     holder.yes.setTag(eventMOs.get(position)); 
     holder.no.setTag(eventMOs.get(position)); 
     holder.maybe.setTag(eventMOs.get(position)); 

     holder.eventNameTxtV.setText(eventMOs.get(position).getText()); 
     holder.eventPlaceTxtV.setText(eventMOs.get(position).getPlace()); 
     holder.sendByNameTxtv.setText(sendUserMO.getUserName()); 

     View v = convertView.findViewById(R.id.invitation_single); 

     v.getRootView().setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent occasionAct = new Intent(InvitationFragment.this.getActivity(), InvitationActivity.class); 
       occasionAct.putExtra("eventMO", eventMO); 
       occasionAct.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(occasionAct); 

      } 

     }); 

     return convertView; 

    } 
+0

merci pour votre réponse que j'ai essayé votre code, mais quand je mets icône pour le premier élément, il définit l'icône pour 2 articles -Premier une et septième Les icônes sont également mélangées en défilant @ Anirudh R Kashyap –