2015-07-21 3 views
0

Accualy Я читаю все сообщения, но я не могу решить свою проблему. И мне нужна помощь.Когда прокручивается GridView, он меняет CheckBox Selections

У меня есть gridview. Я заполняю сетки базовым адаптером. У моих сеток есть ImageViews и CheckBoxes. Я LongTouching любой сетки и проверки CheckBox. Все сделано здесь.

Но когда я просматриваю сетку, все изменения меняются. Я пробую какое-то решение из других сообщений, но я не могу исправить проблему.

Адаптер GetView Method;

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    View grid; 

    if (convertView == null) { 
     grid = new View(mContext); 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     grid = inflater.inflate(R.layout.mygrid, parent, false); 
    } else 
    { 
     grid = (View) convertView; 
    } 

    ImageView imageView = (ImageView) grid.findViewById(R.id.imagepart); 
    final CheckBox ch = (CheckBox)grid.findViewById(R.id.checkBox); 
    ch.setTag(position); 

    HashMap<String,String> tar; 
    tar = data.get(position); 

    imageLoader.DisplayImage(tar.get(FragmentB.FOTOYOL),imageView); 

    grid.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      CheckBox chh = (CheckBox)v.findViewWithTag(position); 
      chh.setChecked(true); 
      return false; 
     } 
    }); 

    return grid; 
} 

Если удалить (== NULL convertView) строку и удалить еще блок затем проверяет, не меняется, но когда флажок будет невидимыми из свитка, возвращаясь с прокруткой на этот флажок и снято. Не проверяется постоянно.

Мне нужна большая помощь. Спасибо ...

ответ

0

Необходимо сохранить статус проверки с вашими резервными данными, а не (только) в представлении. Это означает, что OnLongClickListener должен добавить элемент к tar карте:

tar.put("checked", "true"); 

и getView(…) методу (вне сделать двойной слушатель) необходимо инициализировать флажок из этих данных:

String checked = tar.get("checked"); 
grid.findViewWithTag(position).setChecked(
     checked != null && Boolean.getBoolean(checked) 
    ); 

Примечания: вы должны объявить tar как final, чтобы он был доступен внутри слушателя.

+0

Не могли бы вы объяснить больше, пожалуйста? Сожалею. –

+0

GridView предназначен для повторного использования представлений для повышения эффективности. Так, например, у вас может быть 100 элементов данных, но на экране может поместиться всего 10 представлений. Если представление, показывающее элемент данных 1, прокручивается вверху экрана вверху, это представление перемещается в нижнюю часть и становится 'convertView' для элемента 11. Все данные для элемента 1 все еще там, поэтому вам необходимо перезаписать * все * чтобы правильно отобразить данные 11 (т. е. вы должны снять флажок). Когда вы прокручиваете в другом направлении, вы хотите, чтобы флажки были установлены так же, как и перед прокруткой, поэтому вам нужно отслеживать статус проверки в самих данных. – Barend

+0

Спасибо, но я не могу применить ваш код. Я использую tar-карту только для изображений. Должен ли я назначить новую «карту tar» внутри кликмена? Можете ли вы обновить мой код? Я долго борюсь за эту вещь. Я очень сожалею из-за вашего более измученного. –

0

Я нашел решение с помощью Barend;

Я изменил метод getview следующим образом;

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     View grid; 

      grid = new View(mContext); 
      LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      grid = inflater.inflate(R.layout.mygrid, parent, false); 

     ImageView imageView = (ImageView) grid.findViewById(R.id.imagepart); 
     final CheckBox ch = (CheckBox)grid.findViewById(R.id.checkBox); 
     ch.setTag(position); 

     final HashMap<String,String> tar; 
     tar = data.get(position); 

     imageLoader.DisplayImage(tar.get(FragmentB.FOTOYOL), imageView); 

     String checked = tar.get("checked"); 
     if (checked == "true") 
     { 
      CheckBox hh = (CheckBox)grid.findViewWithTag(position); 
        hh.setChecked(true); 
     } 
     else if (checked == "false") 
     { 
      CheckBox hh = (CheckBox)grid.findViewWithTag(position); 
      hh.setChecked(false); 
     } 

     grid.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       CheckBox chh = (CheckBox)v.findViewWithTag(position); 
       if (chh.isChecked()) 
       { 
        chh.setChecked(false); 
        tar.put("checked","false"); 
       } 
       else 
       { 
        chh.setChecked(true); 
        tar.put("checked", "true"); 
       } 
       return true; 
      } 
     }); 

     return grid; 
    }