2016-02-20 37 views
1

我有一个ListView几个小时的问题。在Android中滚动时Listview项目发生变化

我使用ListView来显示我的警报及其weekdays并使用switch来显示它是否处于活动状态。但是,当我滚动我的weekdaysswitch正在更改时,只有显示时间的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

当我在getView()中有很多条件时,我总是用我的listView适配器来面对这个问题。第一个建议是在getView()中使用最小条件。我使用的另一种解决方案是将getView函数中的所有视图持有者视图初始化为最终变量,并在每个condtion上添加notifyDataSetChange();大多数时候这样做解决了我的问题。 而代替

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

只需使用这个

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

没有别的条件。还初始化您的所有textViews和其他视图之外的这个convertView条件。

注:这是不是最好的解决办法,但这样解决我的问题大部分时间

+0

谢谢你的回答。好吧,我会照你说的去做。我第一次使用它,这就是为什么我对它感到困惑的原因 – HesenliEldar

+0

当我滚动这个时,它使交换机停止如何解决它? – HesenliEldar

+0

你需要将开关的某个值存储在哪里。您可以在列表中为切换活动或不活动创建一个布尔变量,并基于该变量您可以更改您的开关 – Arshad

1

如果convertView != null您应该首先将日间颜色重置为默认值。

+0

谢谢主席先生。它完美地工作和什么开关? – HesenliEldar

相关问题