2016-05-06 5 views
1

У меня проблема с listView, состоящим из флажков. Когда я просматриваю некоторые элементы, их выбирают автоматически. Это мой код для метода GetView в моем пользовательском адаптере:listView checkbox прокрутка ошибка

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

    if (convertView == null) { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.prerequisite_course, parent, false); 

     holder = new ViewHolder(); 
     holder.name = (CheckBox) convertView.findViewById(R.id.course_checkbox); 
     convertView.setTag(holder); 

     holder.name.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       CheckBox cb = (CheckBox) v ; 
       Course course = (Course) cb.getTag(); 
       if (cb.isChecked()) 
        checkBoxChecked(cb, course); 
       else 
        checkBoxNotChecked(cb, course); 
      } 
     }); 
    } 

    else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    Course course = coursesDataManager.getCourseInPosition(position); 
    String currentId = COURSES_SUBJECT + " " + course.getId(); 
    holder.name.setText(currentId); 
    holder.name.setTag(course); 

    // for the clear button: 
    if (!holder.name.isChecked()) { 
     checkBoxNotChecked(holder.name, (Course) holder.name.getTag()); 
    } 

    return convertView; 
} 

private void checkBoxChecked(CheckBox cb, Course add) { 
    cb.setBackgroundColor(Color.rgb(1, 67, 121)); 
    cb.setTextColor(Color.WHITE); 
    myCoursesManager.addPrerequisite(add); 
} 

private void checkBoxNotChecked(CheckBox cb, Course remove) { 
    cb.setBackgroundColor(Color.WHITE); 
    cb.setTextColor(Color.BLACK); 
    myCoursesManager.removePrerequisite(remove); 
} 

Кроме того, критика коды будет воспринята как я новичок в андроид развития. Спасибо.

+0

Сделать модель и хранить в ней флажок. Используйте функцию notifyDatasetChanged для обновления. – Amy

ответ

2

Вы должны поддерживать булев массив для флажка, попробуйте так это работало для меня

public class CustomAdapter extends BaseAdapter { 
    private final LayoutInflater inflater; 
    private final Context context; 
    private List<ModelPooja> listData; 

    public CustomAdapter(Context mainActivity, List<ModelPooja> listData) { 
     context = mainActivity; 
     this.listData = listData; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

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

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

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.list_item_poojaselection, null); 
      holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname); 
      holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck); 
      convertView.setTag(holder); 
     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.checks.setOnCheckedChangeListener(null); 
     holder.checks.setFocusable(false); 

     if (listData.get(position).isselected) { 
      holder.checks.setChecked(true); 
     } else { 
      holder.checks.setChecked(false); 
     } 

     holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton cb, boolean b) { 

       if (checkMaxLimit()) { 

        if (listData.get(position).isselected && b) { 
         holder.checks.setChecked(false); 
         listData.get(position).isselected = false; 

        } else { 
         holder.checks.setChecked(false); 
         listData.get(position).isselected = false; 
         Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show(); 
        } 
       } else { 
        if (b) { 
         listData.get(position).isselected = true; 
        } else { 
         listData.get(position).isselected = false; 
        } 
       } 
      } 
     }); 

     holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME()); 
     return convertView; 
    } 

    public boolean checkMaxLimit() { 
     int countermax = 0; 
     for(ModelPooja item : listData){ 
      if(item.isselected){ 
       countermax++; 
      } 
     } 
     return countermax >= 5; 
    } 

    public class ViewHolder { 
     TextView tv; 
     public CheckBox checks; 
    } 
} 
0

Создания класса модели для сохранения статуса флажка элементов списка.

public class ModelClass 
{ 
    int position=null; 
    String item=null; 
    boolean selected=false; 
    public ModelClass(int position,String item, boolean selected) { 
    super(); 
    this.position=position; 
    this.item=item; 
    this.selected = selected; 
    } 
} 

Затем в вашем адаптере класс

private ArrayList<ModelClass> arl; 

Внутри вашего GetView()

holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       arl.get(position).selected=isChecked; 
      } 
     }); 


holder.checkBox.setChecked(arl.get(position).selected); 

И теперь независимо от того, сколько вы перечисляете ваши Флажки состояние будет соответствовать (Поверь мне, я использовали этот код в моем проекте).