2015-06-23 3 views
1

У меня есть gridview внутри ExpandableListView с CHOICE_MODE_MULTIPLE, я пытаюсь отменить выбор всех элементов, когда я нажимаю кнопку, но, как я это делаю, это только отмена выбора последнего элемента, как я могу их очистить?Очистить все выделенные элементы в gridview

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

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

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

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    holder = null; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.child_item, null); 
     holder = new ViewHolder(); 

     holder.text = (TextView) convertView.findViewById(R.id.name); 
     convertView.setTag(holder); 
     final View finalConvertView = convertView; 
     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       isChecked = child.get(position).isChecked(); 
       if (!isChecked) { 
        child.get(position).setChecked(true); 
       } else { 
        child.get(position).setChecked(false);      
       } 

       ex.findViewById(R.id.notificar).setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(final View v) { 
         //clear all selected items 
         for(int i = 0; i< getCount(); i++){ 
          child.get(i).setChecked(false); 
         } 
        } 
       }); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      holder.text.setText(child.get(position).getNome()); 
      return convertView; 
     } 
    } 
} 
static class ViewHolder { 
    TextView text; 
} 
+1

Вы делаете это с помощью 'adapter', imo лучшим способом было бы сделать это из' activity/fragment', где существует список. У меня похожая ситуация для listView, и она работает хорошо. Просто вызовите функцию в операции/фрагменте на 'onClick' элемента и запустите там цикл выбора. – k1slay

+0

Пока я пытаюсь помочь вам, измените ли вы первые 6 строк своей обработчика 'onClick' на' child.get (position) .setChecked (! IsChecked) '? Очень важно сосредоточиться на вопросе с этими линиями. – gfpacheco

ответ

2

Попробуйте позвонить listView.clearChoices(); и adapter.notifyDataSetChanged(); из действия или фрагмента, содержащего список, а не внутри адаптера.

+0

Пробовал, что не работает – AND4011002849

+0

Как насчет вызова 'adapter.notifyDataSetChanged()' после 'listView.clearChoices()'? Другим вариантом будет метод 'listView.setSelected()'. – gfpacheco

+0

OPS, который сделал трюк, спасибо! – AND4011002849

0

Ваша проблема с помощью вызова child.size первой, она возвращается 1.
Вы получаете подсчитывать ребенка с другого ракурса.

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

Если вы звоните child.size() в вас OnClickListener, где вы используете

public void onClick(final View v) { 

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

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