2013-09-10 2 views
2

У меня возникли проблемы с поиском наилучшего способа хранения и отображения флажков в списке.Установка флажка динамически из sqlite в фрагменте

Сейчас у меня есть код в методе GetView:

@Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      View view = convertView; 
      //final ViewHolder holder; 
      if (convertView == null) { 
       convertView = getActivity().getLayoutInflater().inflate(R.layout.grid_item, null); 
      } 
      ImageView img = (ImageView) convertView.findViewById(R.id.grid_item_img); 

      cb = (CheckBox) convertView.findViewById(R.id.chk_box_griditem); 


      if(photos.get(position).getIshidden()){ 
       cb.setChecked(false); 
      }else{ 
       cb.setChecked(true); 
      } 


      cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
         boolean isChecked) { 
        MySQLiteHelper db = MySQLiteHelper.getInstance(getActivity()); 
        Log.d("checkbox", "status: " + photos.get(position).getIshidden()); 

        if (isChecked) { 
         photos.get(position).setIshidden(true); 
         cb.setChecked(true); 
         Log.d("checkbox", "isChecked"); 
         db.updatePhoto(photos.get(position)); 

        } else { 
         photos.get(position).setIshidden(false); 
         cb.setChecked(false); 
         Log.d("checkbox", "isCheckedelse"); 
         db.updatePhoto(photos.get(position)); 
        } 

       } 
      }); 

      imageLoader.displayImage(imgUrls[position], img, options, animateFirstListener); 

      //img.setImageResource(mImgRes); 
      return convertView; 
     } 

ДБ помощник принимает объект фото в качестве аргумента и обновляет строку, если она существует. Поэтому прямо сейчас я обновляю текущий фотообъект isHidden() как истинный или ложный, а затем передаю обновленный объект в db-помощник.

Физическая база данных, кажется, обновляется правильно. Однако возникает проблема при установке состояния флажков. По-видимому, флажки установлены случайным образом, как отмеченные или снятые флажками.

Также мне нравится делать это в getView, cpu жадный, но я не уверен, как еще это сделать.

+0

Вы не должны устанавливать OnCheckedChangeListener каждый раз, когда вызывается getView. Для каждого флажка достаточно.-> Я вижу, вам нужен новый прослушиватель, потому что вы ссылаетесь на позицию в слушателе. – RaphMclee

+0

К какому классу относится этот метод getView? К адаптеру? И было бы неплохо узнать, какова ваша цель. Что это за объект 'photos'? – RaphMclee

+0

Его из пользовательского адаптера listview 'private class GridAdapter расширяет BaseAdapter' – Nick

ответ

3

Первый удалить cb.setOnCheckedChangeListener ... Вам не нужно установить OnCheckedChangeListener каждый раз, когда GetView является called.you уже написал ниже код, который будет установлен Флажок состояние (зарегистрированный или незарегистрированный), когда list- просматривать грузы.

if(photos.get(position).getIshidden()) 
cb.setChecked(false); 
else 
cb.setChecked(true); 

Теперь установите onItemClick слушателя, как показано ниже на экране списка:

mListView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) 
     { 

      MySQLiteHelper db = MySQLiteHelper.getInstance(getActivity()); 
      Log.d("checkbox", "status: " + photos.get(position).getIshidden()); 

      if(photos.get(position).getIshidden()) 
      { 
       ((CheckBox)arg0.getChildAt(position).findViewById(R.id.chk_box_griditem)).setChecked(true); 
       photos.get(position).setIshidden(false); 
       db.updatePhoto(photos.get(position)); 

      } 
      else 
      { 
       ((CheckBox)arg0.getChildAt(position).findViewById(R.id.chk_box_griditem)).setChecked(false); 
       photos.get(position).setIshidden(true); 
       db.updatePhoto(photos.get(position)); 

      } 

     } 


    }); 

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

Я надеюсь, что это будет работы.Если не дайте мне знать .. :)

1

Когда вы инициализируете свой флажок, вы устанавливаете для состояния проверки значение false, если изображение скрыто.

if(photos.get(position).getIshidden()){ 
    cb.setChecked(false); 
}else{ 
    cb.setChecked(true); 
} 

Но в Слушателе вы устанавливаете изображение, чтобы скрыть, когда установлен флажок.

if (isChecked) { 
    photos.get(position).setIshidden(true); 
... 

Это на самом деле обратное. Вы, вероятно, обеспокоены этим. И вам не нужно снова устанавливать проверенное состояние в слушателе.

Так что ваш код в слушатель может выглядеть следующим образом:

if (isChecked) { 
    photos.get(position).setIshidden(false); 
    Log.d("checkbox", "isChecked"); 
    db.updatePhoto(photos.get(position)); 

} else { 
    photos.get(position).setIshidden(true); 
    Log.d("checkbox", "isCheckedelse"); 
    db.updatePhoto(photos.get(position)); 
} 
0

1) Не устанавливайте флажок в слушателе

2) Приложить слушателя в окошке только если convertView равна нулю (т.е. при раздувании). Когда вы получаете свой вид из конвертирования, он уже имеет свой набор слушателей.

0

Изменить, а затем войти. OnCheckedChange вы можете обойтись без операторов if и просто использовать логическое значение. Вам не нужно устанавливать значение в флажке в проверочном прослушиваемом файле. Intialize db in onResume, поэтому он не знает, сколько раз пользователь нажимает что-то, и инициализация db замедляет работу.

cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
        photos.get(position).setIshidden(isChecked); 
        db.updatePhoto(photos.get(position)); 
        Log.d("checkbox", isChecked.toString()); 
      } 
     }); 



@Override 
protected void onResume() { 
    if (db==null) { 
     db = MySQLiteHelper.getInstance(getActivity()); 
    } 
} 
Смежные вопросы