2016-02-20 2 views
1

У меня есть проблема с ListView в течение нескольких часов.Элементы списка просмотра при прокрутке на Android

Я использую ListView, чтобы показать свои сигналы тревоги и его weekdays и использовать switch, чтобы показать, активен ли он. Однако, когда я прокручиваю свои weekdays и switch меняется, только элемент textview, отображающий время, не изменяется.

Как решить эту проблему?

public class AlarmListCustomAdapter extends BaseAdapter { 

    private ArrayList<AlarmDomain> alarmDomains; 
    private LayoutInflater layoutInflater; 
    private Context context; 
    private UserDomain userDomain; 
    private AlarmListCustomAdapter alarmListCustomAdapter = this; 
    public boolean[] firstChecked; 

    public AlarmListCustomAdapter(Context context, ArrayList<AlarmDomain> alarmDomains, UserDomain userDomain, boolean[] firstCheck) { 

     this.alarmDomains = alarmDomains; 
     this.context = context; 
     layoutInflater = LayoutInflater.from(context); 
     this.userDomain = userDomain; 
     this.firstChecked = firstCheck; 
    } 

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

    @Override 
    public AlarmDomain getItem(int position) { 
     return alarmDomains.get(position); 
    } 

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

    @Override 
    public int getItemViewType(int position) { 
     // current menu type 
     return position % 3; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder holder = null; 
     if (convertView == null) { 
      convertView = View.inflate(context, R.layout.alarm_list_item, null); 


      holder = new ViewHolder(); 
      holder.textView = (TextView) convertView.findViewById(R.id.textView4); 
      holder.aSwitch = (Switch) convertView.findViewById(R.id.switch1); 
      holder.Mo = (TextView) convertView.findViewById(R.id.Mo); 
      holder.Tu = (TextView) convertView.findViewById(R.id.Tu); 
      holder.We = (TextView) convertView.findViewById(R.id.We); 
      holder.Th = (TextView) convertView.findViewById(R.id.Th); 
      holder.Fr = (TextView) convertView.findViewById(R.id.Fr); 
      holder.Sa = (TextView) convertView.findViewById(R.id.Sa); 
      holder.Su = (TextView) convertView.findViewById(R.id.Su); 
      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder)convertView.getTag(); 

     } 
     try { 

      Long time = alarmDomains.get(position).getTime(); 
      long h = time/60; 
      long m = time % 60; 
      String hour = String.valueOf(h); 
      if (h < 10) hour = "0" + hour; 
      else { 
       hour = String.valueOf(h); 
      } 
      String minute = String.valueOf(m); 
      if (m < 10) minute = "0" + minute; 
      else { 
       minute = String.valueOf(m); 
      } 
      holder.textView.setText(String.valueOf(hour) + ":" + String.valueOf(minute)); 
      long[] weekdays1 = alarmDomains.get(position).getWeekDays(); 
      for (long x : weekdays1) { 
       switch ((int) x) { 

        case 2: 
         holder.Mo.setTextColor(Color.parseColor("#0055a7")); 
         break; 
        case 3: 
         holder.Tu.setTextColor(Color.parseColor("#0055a7")); 
         break; 
        case 4: 
         holder.We.setTextColor(Color.parseColor("#0055a7")); 
         break; 
        case 5: 
         holder.Th.setTextColor(Color.parseColor("#0055a7")); 
         break; 
        case 6: 
         holder.Fr.setTextColor(Color.parseColor("#0055a7")); 
         break; 
        case 7: 
         holder.Sa.setTextColor(Color.parseColor("#0055a7")); 
         break; 
        case 1: 
         holder.Su.setTextColor(Color.parseColor("#0055a7")); 
         break; 
        default: 
         break; 
       } 
      } 

      if (alarmDomains.get(position).getIsActive() == 1) 
       holder.aSwitch.setChecked(true); 
      else { 
       holder.aSwitch.setChecked(false); 
      } 

      holder.aSwitch.setText(String.valueOf(position)); 
      holder.aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

        if (isChecked) 
         editIsActive(buttonView.getText().toString(), 1); 
        else 
         editIsActive(buttonView.getText().toString(), 0); 

       } 
      }); 

     } catch (Exception e) { 
     } 
     convertView.setTag(holder); 
     return convertView; 
    } 

    public void editIsActive(String idx, int isActive) { 

     AlarmDomain alarmDomain = alarmDomains.get(Integer.valueOf(idx)); 
     alarmDomain.setIsActive(isActive); 
     EditAlarmController editAlarmController = new EditAlarmController(); 
     editAlarmController.isActive(context, alarmDomain, alarmListCustomAdapter); 
    } 

    public void onResultIsActive(Object object) { 

    } 

    private class ViewHolder { 

     TextView textView; 
     Switch aSwitch; 
     TextView Mo; 
     TextView Tu; 
     TextView We; 
     TextView Th; 
     TextView Fr; 
     TextView Sa; 
     TextView Su; 
    } 

} 

ответ

1

Я всегда сталкиваюсь с этой проблемой с моим адаптером listView, когда у меня есть много условий в getView(). Первые предложения - использовать минимальные условия в getView(). Другим решением, которое я использую, является инициализация всех представлений держателя вида в функции getView как конечная переменная, и на каждом condtion добавьте notifyDataSetChange(); Большую часть времени это решает мою проблему. И вместо

if(convertView == null) { 
//your code 
} else { 
    convertView.getTag() 
} 

Используйте только этот

if(converView == null) { 
    //inflate view 
} 

Нет другого условия. Также инициализируйте все ваши текстовые и другие представления вне этого условия convertView if.

Примечание: Это не лучшее решение, но делать это решает мою проблему большую часть времени

+0

Благодарим вас за ответ. Хорошо, я сделаю так, как вы сказали. Я использую его в первый раз, поэтому я запутался в этом. – HesenliEldar

+0

Когда я прокручиваю это, он делает дезактивацию переключателя, как он может решить эту проблему? – HesenliEldar

+0

Вам нужно сохранить значение переключателя где угодно. Вы можете создать логическую переменную в списке для активного или нет коммутатора, и на основе этого вы можете изменить свой переключатель. – Arshad

1

Если convertView != null, вы должны сначала сбросить цвета дня до значения по умолчанию.

+0

Спасибо сэр .Это прекрасно работал и что о переключателе? – HesenliEldar

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