2015-07-11 3 views
0

привет У меня есть флажки внутри списка У меня есть восемь вариантов, и я хочу, чтобы пользователь мог проверить только четыре, а затем заблокировать флажки, если он не отменит его.Как определить количество флажков, которые можно проверить в Android?

Это мой Main:

public class Ch2 extends Activity implements OnItemClickListener{ 
    ListView lv; 
    ArrayAdapter<Model> adapter; 
    List<Model> list = new ArrayList<Model>(); 
    int num; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.activity_ch2); 

     lv = (ListView) findViewById(R.id.listView2); 
     adapter = new cusCh2(this,getModel()); 
     lv.setAdapter(adapter); 
     lv.setOnItemClickListener(this); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 
     TextView label = (TextView) v.getTag(R.id.label); 
     final CheckBox checkbox = (CheckBox) v.getTag(R.id.check); 
     checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 

      @Override 
      public void onCheckedChanged(CompoundButton arg0, boolean isChecked) { 
       if (isChecked){ 

        Toast.makeText(getApplicationContext(),"hi",Toast.LENGTH_LONG); 

        // disable checkbox 
       } 
      } 
     }); 
     Toast.makeText(v.getContext(), label.getText().toString()+" "+isCheckedOrNot(checkbox), Toast.LENGTH_LONG).show(); 

    } 

    private String isCheckedOrNot(CheckBox checkbox) { 
     if(checkbox.isChecked()) { 
      num++; 
      if (num == 4) { 
       checkbox.setEnabled(false); 

      } 
      return "is checked"; 

     } else 
      return "is not checked"; 
    } 


    private List<Model> getModel() { 
     list.add(new Model("a")); 
     list.add(new Model("b")); 
     list.add(new Model("c")); 
     list.add(new Model("d")); 
     list.add(new Model("e")); 
     list.add(new Model("f")); 
     list.add(new Model("m")); 
     list.add(new Model("o")); 
     return list; 
    } 

и это мой ArrayAdapter

public class cusCh2 extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    boolean checkAll_flag = false; 
    boolean checkItem_flag = false; 


    public cusCh2(Activity context, List<Model> list) { 
     super(context, R.layout.row, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox; 


    } 

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



    ViewHolder viewHolder = null; 
    if (convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     convertView = inflator.inflate(R.layout.row, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
     viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 
     final ViewHolder finalViewHolder = viewHolder; 
     final ViewHolder finalViewHolder1 = viewHolder; 
     final ViewHolder finalViewHolder2 = viewHolder; 
     viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 

      } 
     }); 
     convertView.setTag(viewHolder); 
     convertView.setTag(R.id.label, viewHolder.text); 
     convertView.setTag(R.id.check, viewHolder.checkbox); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    viewHolder.checkbox.setTag(position); // This line is important. 

    viewHolder.text.setText(list.get(position).getName()); 
    viewHolder.checkbox.setChecked(list.get(position).isSelected()); 

    return convertView; 
} 
} 

и это моя модель

public class Model { 

    private String name; 
    private boolean selected; 

    public Model(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

я, конечно, есть row.xml файл

как я говорю , Я хочу m ake мой пользователь может проверить не более четырех ящиков.

Решение, которое я попробовал:

@Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
     list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
     if(!isChecked){ 
      num++; 

      if(num>3){ 
       finalViewHolder.checkbox.setChecked(false);} 
      if(!isChecked){ 
       num--; 
       if(num<3){ 
        finalViewHolder.checkbox.setChecked(true);} 
      } 


     } 
    } 
}); 

Это работает как проверка стоп, но когда я прокручиваю список, я теряю то, что я уже проверил.

редактировать 2:

 viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

       int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 

       Toast toast= Toast.makeText(getContext(), String.valueOf(getPosition), Toast.LENGTH_SHORT); 

       if (isChecked) { 
        num++; 
        l.add(String.valueOf(getPosition)); 
        if(l.size() > 3){  
         finalViewHolder.checkbox.setChecked(false); 
        }   
        toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0); 
        toast.show(); 
       } 

        else if(!isChecked){ 
        finalViewHolder.checkbox.setChecked(true); 
        } 

      } 

     }); 

также, когда я прокручивать я Потеря, что я уже проверил

редактировать 2:

viewHolder.checkbox.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       int getPosition = (Integer) v.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       list.get(getPosition).setSelected(finalViewHolder.checkbox.isChecked()); // Set the value of checkbox to maintain its state. 
       Toast toast= Toast.makeText(getContext(), String.valueOf(getPosition), Toast.LENGTH_SHORT); 

       if (finalViewHolder.checkbox.isChecked()) { 

        l.add(String.valueOf(getPosition)); 
        toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0); 
        toast.show(); 

        if (l.size() > 4) { 
         finalViewHolder.checkbox.setChecked(false); 
        } 


        if (!finalViewHolder.checkbox.isChecked()) { 
         finalViewHolder.checkbox.setChecked(true); 

        } 

       } 
      } 

     } 
    ); 

Я надеюсь, что кто-то может мне помочь, спасибо.

ответ

0

нормально, ребята Спасибо ему за то время, я считаю, что мое решение

проблема, что даже если и писать checkbox.setChecked (ложь); андроид по-прежнему считается как проверено, даже если не с моим Arraylist, увеличится, что когда-либо проверялось, или нет. Я прекратил это с помощью make list удалять последний элемент, когда вы станете setChecked (false); теперь это нормально работать это решение кода

 viewHolder.checkbox.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       int getPosition = (Integer) v.getTag(); 

       if (finalViewHolder.checkbox.isChecked()) { 

        l.add(getItem(getPosition).getName()); 
        Toast toast= Toast.makeText(getContext(),String.valueOf(l.size()), Toast.LENGTH_SHORT); 
        toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0); 
        toast.show(); 

        if (l.size() > 4) { 
         finalViewHolder.checkbox.setChecked(false); 
         l.remove(getItem(getPosition).getName()); 



        } 

       } 
        else if (!finalViewHolder.checkbox.isChecked()) { 
         l.remove(getItem(getPosition).getName()); 

        } 

       list.get(getPosition).setSelected(finalViewHolder.checkbox.isChecked()); 
      } 

     } 
    ); 
0

Это происходит потому, что при прокрутке списка setOnCheckedChangeListener будет called.evrytime когда GetView называется ... вместо этого использовать onClickListener на CheckBox

checkbox.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        if (checkbox.isChecked()) { 

        } else if (!checkbox.isChecked()) { 

         } 
        } 

       } 
      }); 
+0

хорошо это сделать еще одну проблему после блокировки, если попробовать проверки, затем прокрутить затем обратно в коробку будет проверяться автоматической – chaos

+0

сп у разделить уры кода ... и должна отсутствовать somethng ..i думаю, что работа ur action снова вызвана ..if u lock или unlock – Meenal

+0

Я редактирую свой вопрос и добавляю свой код, работаю нормально, но одна проблема при блокировке и пытаюсь проверить один, да, я не могу, но когда прокрутка и обратно к одному я попробовал, это проверено автоматически – chaos

0

Вы можете использовать список, хранить проверенную items.you можно поместить отмеченный элемент в список в OnCheckChangelistner/OnClicklistner.iF пользователь снимите флажок с элемента, и он уже находится в списке, чем удалите его из списка. И всегда проверяйте размер списка для подсчета элементов. Вы можете выбрать тип списка, поскольку вы предпочитают: - список или что-нибудь, что хранит идентификаторы.

 holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // TODO Auto-generated method stub 
       Log.e("checked : ", "Clicked on Checkbox: " +contactList.get(position).getName() +" is " + isChecked); 




       ContactPhone cp = contactList.get(position); 
       if(isChecked){ 
        cp.setState(isChecked); 
        addToSelected(cp); 

       }else{ 
        cp.setState(isChecked); 
        removeSelected(cp); 
       } 

       if(selected_contats.size() > 4){ 

       }else{ 

        } 
       } 

     } 
    }); 

Вот это ...

+0

это работа, но у меня такая же проблема когда lock and i scroll unchecked all checkbox – chaos

+0

вы проверили его после комментирования кода (checkbox desable) code –

+0

Я обновляю свой вопрос и добавляю то, что я пробовал , поскольку я говорю, что это работа, но когда прокрутка я теряю то, что я проверяю – chaos

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