2016-01-13 3 views
0

У меня есть список. Когда пользователь нажимает элемент в этом списке, под этим элементом будут показаны три кнопки (а именно Да, Нет и Может), поэтому пользователь может выбрать любой из кнопки и что реакция (как 1,2,3 для да, нет, может быть) будет GetView saved.In адаптера только мы получаем, что ответ и показывает ImageView на строке весь список элементаImageView элемента в списке, перетасованного при прокрутке

настройки изображения в GetView 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); 
         } 

        } 

это прекрасно работает, но когда у меня есть больше элементов в списке, изображение не отображается для соответствующего элемента/перетасовывается при прокрутке

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; 

     } 

это мой полный код адаптера любые один помочь мне поддерживать соответствующий ImageView для каждого элемента в списке при прокрутке

ответ

0

ListView работает путем рециркуляции views.To узнать больше о том, как это работает вы можете иметь посмотрите на это (http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/).

Проблема с кодом заключается в том, что изображение устанавливается только один раз, когда convertView равно null. Когда вы прокручиваете список, представление списка передает переработанную строку в функцию getView (это происходит, когда convertView не будет null). В этом случае вы не устанавливаете ImageView.

Я изменил код, это должно работать

// 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

спасибо за ваш ответ я попробовал ваш код, но когда я установить значок для первого пункта она устанавливает иконку для 2-х элементов -first один и седьмых один. Значки также перетасовываются при прокрутке @ Анируд Р. Кашьяп –

Смежные вопросы