2015-05-12 2 views
1

Я реализовал этот образец (пример 2. Custom Adapter) http://www.mkyong.com/android/android-gridview-example/ и он работает.Android - GridView форсирует обновление при изменении данных

Я тогда хотел «обновить» данные с новым набором, который не работать, пока я не сделал это:

imageAdapter.notifyDataSetChanged(); 

, а затем удаляют следующую проверку в методе ImageAdapter GetView:

if (convertView == null) { 

Вот мой текущий метод GetView

public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View gridView; 

    // if (convertView == null) { // stopped my GridView from updating !! 
    if (true) 
    { 
     gridView = new View(context); 

     // get layout from mobile.xml 
     gridView = inflater.inflate(R.layout.mobile, null); 

     // set value into textview 
     TextView textView = (TextView) gridView 
       .findViewById(R.id.grid_item_label); 

     textView.setText(mobileValues[position]); 


     // set image based on selected text 
     ImageView imageView = (ImageView) gridView 
       .findViewById(R.id.grid_item_image); 

     imageView.setImageResource(R.drawable.square); 


    } else { 
     gridView = (View) convertView; 
    } 

    return gridView; 
} 

Я обеспокоен, что сейчас делает ненужной про многократно перерезать, т. е. раздувать изображение несколько раз?

Должен ли я создавать новый GridView каждый раз, когда это называется?

+0

просто сообщите администратору, что вы передали конструктор адаптера не весь массив. –

ответ

1

это не сработало, потому что следующие строки

TextView textView = (TextView) gridView 
      .findViewById(R.id.grid_item_label); 

    textView.setText(mobileValues[position]); 


    // set image based on selected text 
    ImageView imageView = (ImageView) gridView 
      .findViewById(R.id.grid_item_image); 

    imageView.setImageResource(R.drawable.square); 

идут вне если/другое. Требуется проверка if (convertView == null). Если у вас его нет, вы будете раздувать n разных видов, с n == getCount(). Для n большой будет проблема. И вы, вероятно, захотите реализовать шаблон android ViewHolder, чтобы дать вашим пользователям лучший UX.

Как правильно указал @Vzsg, избавиться также от gridView = new View(context);. Это дополнительное бесполезное размещение

+0

Возможно, стоит отметить, что эта строка: gridView = new View (context); 'не требуется. – vzsg

+0

@vzsg, спасибо, я его отредактировал – Blackbelt

+0

OK thanks - испытал и отлично работает (все еще) - также будет исследовать шаблон ViewHolder - к сожалению, я не могу пометить ваш ответ, поскольку моя репутация слишком низкая! Главным образом из-за приводных уценок! – NottmTony

0

Обычно я просто обновляю адаптер с новыми результатами и устанавливаю его в GridView.

Итак, в вашем примере, когда я хочу обновить свой GridView, я делаю следующее.

gridView.setAdapter(newAdapter); 

У вас может быть полезный метод, например, это облегчит получение нового адаптера.

private ArrayAdapter getAdapter(String [] data){...} 
Смежные вопросы