1

Я хотел изучить sqlite для Android, поэтому я создал приложение для мгновенного тегирования, в котором пользователь может пометить свои фотографии и загрузить их в свою сеть (google +, fb, twitter). У меня есть ListFragment, в котором пользователь может видеть все теги, которые он сделал, элементы изображения в списке хранятся в скрытой папке, а слова хранятся в sqlite db .. проблема заключается в том, что при прокрутке вверх или вниз некоторые элементы просто переключаются случайным образом, даже если у меня больше чем 8 элементов, их 8 первых элементов отображаются повторно (т.е. 1-8, а вместо 9-12 я вижу 1-4 снова) Единственная проблема может быть в адаптере, но после сеансов на сеансах отладки я не могу найти проблему мой код для адаптера -Странная ошибка в listfragment

public class FlowAdapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList<HashMap<String, List<String>>> data; 
    private static LayoutInflater layoutInflater = null; 

    public FlowAdapter(Activity activityContext, 
      ArrayList<HashMap<String, List<String>>> data) { 
     this.activity = activityContext; 
     this.data = data; 
     this.layoutInflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return data.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // method variables 
     ViewHolder cacheView; 
     HashMap<String, List<String>> photos = null; 
     photos = data.get(position); 
     ImageView iv; 
     FlowLayout flow; 

     ArrayList<String> subjects = new ArrayList<String>(); 

     if (convertView == null) { 
      cacheView = new ViewHolder(); 
      convertView = layoutInflater.inflate(R.layout.list_item, null); 
      flow = (FlowLayout) convertView.findViewById(R.id.flow_tags);; 

      // add the tags to the flowlayout 
      int size = photos.get(DatabaseHandler.KEY_TAGS).size(); 
      for (int i = 0; i < size; i++) { 
       String name = String.format("#%s", 
         photos.get(DatabaseHandler.KEY_TAGS).get(i)); 
       Bubble.getBubble(name, flow, subjects, activity, photos 
         .get(DatabaseHandler.KEY_THUMBNAILPATH).get(1), false); 
      } 
      cacheView.image = (ImageView)convertView.findViewById(R.id.list_image);//iv; 
      cacheView.tags = flow; 
      convertView.setTag(cacheView); 

     } 

     cacheView = (ViewHolder) convertView.getTag(); 
     cacheView.image.setImageBitmap(null); 
     DecodeTask task = new DecodeTask(cacheView.image); 
     task.execute(photos.get(DatabaseHandler.KEY_THUMBNAILPATH).get(1)); 
     cacheView.image.setTag(R.id.list_image, task); 

     return convertView; 
    } 

    static class ViewHolder { 
     static FlowLayout tags; 
     static ImageView image; 

     public static FlowLayout getFlowLayout() { 
      return tags; 
     } 
    } 
} 

Схемы потока здесь - макета http://nishantvnair.wordpress.com/2010/09/28/flowlayout-in-android/ Пузырь отсюда - http://nishantvnair.wordpress.com/2010/09/28/android-create-bubble-like-facebook/ я использую этот SO нити, чтобы загрузить изображения на фоне - Large ListView containing images in Android любой помощи? = \ p.s Я знаю, что уже есть приложения, такие как [и на самом деле, но лучшее обучение приходит при написании кода, так что я сделал =)]

+0

Как насчет размещения этой строки ** cacheView = (ViewHolder) convertView.getTag(); ** внутри условия else? Не уверен, что это поможет, но вы можете попробовать? –

+0

По-прежнему нет эффекта ... Я подозреваю, что у него как-то есть соединение с flowlayout или bubbleview, поскольку они являются динамическими (другими словами, нет идентификатора, к которому я прикрепляю макет пузыря, я просто добавляю их в flowlayout во время выполнения - посмотрите на их реализацию на ссылках, которые я добавил) – crazyPixel

ответ

4

Причина очевидна !!! У вас есть статические переменные в ViewHolder:

Вместо:

static class ViewHolder { 
    static FlowLayout tags; 
    static ImageView image; 

    public static FlowLayout getFlowLayout() { 
     return tags; 
    } 
} 

Это необходимо быть:

static class ViewHolder { 
    FlowLayout tags; 
    ImageView image; 

    public FlowLayout getFlowLayout() { 
     return tags; 
    } 
} 

Больше на static переменные доступны в Интернете, короче говоря, они не являются переменными экземпляра поэтому изменение его значения изменит его для каждого экземпляра (хотя переменную static следует получить с помощью ссылки на класс).

UPDATE:

Кроме того, необходимо, чтобы отменить ваш DecodeTask если convertView равно нулю, как учебник говорит: Large ListView containing images in Android

Но держать эти переменные static как простая ошибка и легко обнаружить, как вы можете обнаружить ошибка 2+2 = 5. Сказать, что удаление модификатора static, похоже, сломалось, означает, что что-то еще не так с вашим кодом.

+0

не работает ... это даже ухудшилось .. = \ перед использованием статики был один элемент во всем списке «неправильное поведение», а некоторые просто не появились, теперь есть даже одно изображение в нужном месте (рядом с соответствующим описанием) ... – crazyPixel

+0

'даже ухудшилось 'не обязательно означает, что вы сделали что-то не так. Это наглядно показывает, что код загрузки фотографий неверен где-то. Как делает переменные статические, кажется, работает. На втором взгляде я смог определить, что вы не отменяете 'DecodeTask', как было предложено в учебнике в' else' в 'getView()'. Вскоре я уточню ответ, чтобы указать на это более четко. –

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