2014-11-19 2 views
0

У меня есть GridView с одним ImageView и одним TextView ниже в каждой ячейке.GridView остается пустым

Логика работает хорошо. Я делаю ссылку на мой GridView, устанавливаю столбцы и устанавливаю адаптер. Во время этого у меня есть поток, который устанавливает изображения и их имя в список. (Один список DrawAble для изображений и один список строк для этикеток). Чтобы удовлетворить моих пользователей, я хочу обновить GridView, пока поток добавляет изображения и ярлыки в списки.

Но обновление работает только в том случае, если я предоставляю неприятные статические переменные. (Я ненавижу их). ИЛИ если я устанавливаю новый адаптер в GridView каждый раз, когда произошло обновление. (Это также противно, потому что вы не в состоянии прокрутить GridView во время обновления ист ..)

Это мой CustomAdapter:

public CustomAdapter(DialogBox dialogBoxActivity,List<Drawable> imported_scaled_images, List<String> imported_labels, int position) { 
    this.context = dialogBoxActivity; 
    this.scaledImage = imported_scaled_images.toArray(new Drawable[imported_scaled_images.size()]); 
    this.labels = imported_labels.toArray(new String[imported_labels.size()]); 
    this.used_cells = position; 
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 

public void updateGrid(List<Drawable> imported_scaled_images, List<String> imported_labels, int position) { 
    this.scaledImage = imported_scaled_images.toArray(new Drawable[imported_scaled_images.size()]); 
    this.labels = imported_labels.toArray(new String[imported_labels.size()]); 
    this.used_cells = position; 
    this.notifyDataSetChanged(); 
    Log.e("update","true"); 
} 

@Override 
public void notifyDataSetChanged() { 
    // TODO Auto-generated method stub 
    super.notifyDataSetChanged(); 
    Log.e("notify","true"); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return used_cells; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public class Holder { 

    ImageView img; 
    TextView tv; 

    public Holder(ImageView img, TextView tv) { 
     this.img = img; 
     this.tv = tv; 
    } 
} 


@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    ImageView img; 
    TextView tv; 
    TextView tv_abc; 

    if(convertView == null) { 
     convertView = inflater.inflate(R.layout.customadapter_view_layout, null); 
     img = (ImageView) convertView.findViewById(R.id.img); 
     tv =(TextView) convertView.findViewById(R.id.tv); 
     //tv_abc = (TextView) convertView.findViewById(R.id.tv_normal_portrait_abc); 
     convertView.setTag(new Holder(img,tv)); 
    } else { 
     Holder holder = (Holder) convertView.getTag(); 
     img = holder.img; 
     tv = holder.tv; 
     //tv_abc = holder.tv_abc; 

    } 
      img.setImageDrawable(scaledImage[position]); 
      tv.setText(labels[position]); 
      notifyDataSetChanged(); 
    return convertView; 
} 

}

И на моей деятельности я есть updateGrid и я называю это в TimerTask на MainThread:

private void updateGrid() { 
    customAdapter.updateGrid(images, labels, position); 
} 

что Случается, что GridView остается пустым. Возможно, это потому, что Position равно 0, а im. Установка базового адаптера в gridview. Но это не может быть проблемой, потому что когда я обновляю, он должен распознавать новый размер в getCount(). И снова логика работает хорошо. Изображения, где добавлены и методы updateGrid и notiyDataSetChanged, вызываются так, как я хочу. Но GridView остается, как, я не люблю показывать эти изображения (полностью пустые).

Надеюсь, что-то может обеспечить хорошее решение. Я ценю каждую помощь и каждое усовершенствование кода, опубликованного выше. (Что касается производительности или чего-то еще). Спасибо!

Обновление: Позиция - это моя переменная, которая подсчитывает доступные ячейки. Потому что некоторые ячейки пусты (= null). Из-за этого я не знаю, сколько ячеек будет заполнено (потому что я сортирую изображения по алфавиту (для каждой строки => некоторые ячейки заполнены нулями), я не могу предоставить метод BaseAdapters getCount число до того, как моя логика hasn ' т законченный)

ответ

1

GetCount возвращение всего не считать ни один элемент не какой-либо позиции:

@Override 
public int getCount() { 
    return imported_scaled_images.size(); 
} 
+0

Благодарим вас за ответ. Как видите, import_scaled_Images доступен только в конструкторе или в методе updateGrid. Но доступно доступно scaledImages (массив, который получает свои данные из imported_scaled_Images). Поэтому я ввел метод getCount: 'scaledImage.length' .. но проблема остается прежней. GridView остается пустым. Энди другие предложения? @Haresh Chhelana – MMike

+0

@ MMike, попробуйте сохранить локальный ToalItemCoounter в адаптере и обновленное значение, когда данные сетки обновления также возвращают значение ToalItemCoounter в getCount() –

+0

! Я принял ваш ответ :) – MMike

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