Search code examples
androidlistviewandroid-listviewlistview-adapter

ListView section dividers jumping and multiplying


my ListView is going insane and I don't know why.

Here, in adapter I put a ListView section divider with VISIBLE/GONE method. And for test purpose I set if statement in position 0. Now, I expect the section divider to be VISIBLE only above position == 0 list item, but it gets really fun:

At first it looks good, but when I scroll down the listView I can see, that the section divider is not just in position == 0 , but in a random positions and they shouldn't be there. On top of that, when I scroll back, divider gets mixed into another list items, so instead of one divider, there is random number of them at a random positions, what is happening and what should I do to fix it ?

Oh, and here is my adapter :

public class ScheduleListAdapter extends BaseAdapter {

Context mContext;
List<ScheduleItem> scheduleItems;
LayoutInflater mLayoutInflater;
String[] weekDays;

public ScheduleListAdapter(Context mContext, List<ScheduleItem> scheduleItems) {
    this.mContext = mContext;
    this.scheduleItems = scheduleItems;
    mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    weekDays = mContext.getResources().getStringArray(R.array.schedule_days);
}

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

@Override
public Object getItem(int position) {
    return scheduleItems.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = mLayoutInflater.inflate(R.layout.list_item_schedule, null);
        holder.startTime = (TextView) convertView.findViewById(R.id.textView_scheduleStartTime);
        holder.endTime = (TextView) convertView.findViewById(R.id.textView_scheduleEndTime);
        holder.module = (TextView) convertView.findViewById(R.id.textView_scheduleModule);
        holder.lecturer = (TextView) convertView.findViewById(R.id.textView_scheduleLecturer);
        holder.moduleType = (TextView) convertView.findViewById(R.id.textView_scheduleModuleType);
        holder.room = (TextView) convertView.findViewById(R.id.textView_scheduleRoom);
        holder.daySeparator = (TextView) convertView.findViewById(R.id.textView_scheduleDay);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    ScheduleItem scheduleItem = scheduleItems.get(position);
    if (position == 0) {
        switch (scheduleItem.getDayNumber()) {
            case 1:
                holder.daySeparator.setText(weekDays[0]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            case 2:
                holder.daySeparator.setText(weekDays[1]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            case 3:
                holder.daySeparator.setText(weekDays[2]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            case 4:
                holder.daySeparator.setText(weekDays[3]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            case 5:
                holder.daySeparator.setText(weekDays[4]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            default:
                holder.daySeparator.setVisibility(View.GONE);
        }
    }
    holder.startTime.setText(scheduleItem.getStartTime());
    holder.endTime.setText(scheduleItem.getEndTime());
    holder.module.setText(scheduleItem.getModule());
    holder.lecturer.setText(scheduleItem.getLecturer());
    holder.moduleType.setText(scheduleItem.getModuleType());
    holder.room.setText(scheduleItem.getRoom());

    convertView.setEnabled(false);
    convertView.setOnClickListener(null);
    return convertView;
}

private static class ViewHolder {
    TextView startTime;
    TextView endTime;
    TextView module;
    TextView lecturer;
    TextView moduleType;
    TextView room;
    TextView daySeparator;
}

}

Thanks ;)


Solution

  • I faced similar issue in my program. So I added a else to reset whatever if was setting like color, background or in your case dividers.

    if (position == 0) {
        switch (scheduleItem.getDayNumber()) {
            case 1:
                holder.daySeparator.setText(weekDays[0]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            case 2:
                holder.daySeparator.setText(weekDays[1]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            case 3:
                holder.daySeparator.setText(weekDays[2]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            case 4:
                holder.daySeparator.setText(weekDays[3]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            case 5:
                holder.daySeparator.setText(weekDays[4]);
                holder.daySeparator.setVisibility(View.VISIBLE);
                break;
            default:
                holder.daySeparator.setVisibility(View.GONE);
        }
    }else{//add code here to reset whatever you set
         holder.daySeparator.setVisibility(View.GONE);
    }