У меня много часов проблема с ListView.

Я использую 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
HesenliEldar 20 Фев 2016 в 17:43

2 ответа

Лучший ответ

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

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

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

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

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

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

1
Arshad 20 Фев 2016 в 15:15

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

1
Buddy 20 Фев 2016 в 15:09