2017-02-21 15 views
1

Во многих примерах и учебниках - как использовать gridView и адаптер - это тот случай, когда в нашем адаптере мы реализуем некоторый список имен, например, элементов в gridView.Android-адаптер для gridView - список кнопок вместо имен списков кнопок

Мы переопределяем метод getView в адаптере. Затем мы надуваем наш элемент в gridView. Затем мы его изменения текста в текст из списка [положение]

Вот пример кода:

общественного класса TileAdapter расширяет BaseAdapter {

private Context context; 
private Tile[] tiles; 

public TileAdapter(Context context, Tile[] tiles){ 
    this.context = context; 
    this.tiles= tiles; 
} 

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

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

    View gridView; 

    if(convertView == null){ 

     gridView = new View(context); 
     gridView = inflater.inflate(R.layout.layout_tile, null); 

     TextView textView = (TextView) gridView.findViewById(R.id.tile_title); 
     textView.setText(tiles[position].getTitle()); 

    }else{ 
     gridView = (View) convertView; 
    } 

    return gridView; 

} 

Все работает отлично. Но что, если мне нужно создать элементы из его списка?

Предположим, у нас есть где-то List<Button> buttons, где у нас есть наши кнопки, которые мы также используем в других классах. Адаптер GridView получает из списка «MainClass» этот список.

Как закодировать getView() в Адаптер для установки в качестве элементов наших кнопок из этого списка? Итак, чтобы не создавать новые кнопки и не указывать, что метка новой кнопки такая же, как в списке, но вставлять в gridView exatcly эти кнопки из списка!

Так что мне нужно что-то подобное? Вы знаете эту идею?

поле мой класс, продлив Button

@Override 

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

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

     if(convertView == null){ 

      view= new View(context); 
      view= inflater.inflate(R.layout.field_layout, null); 

      //This is bad - but You know what i want? 
      Field field = (Field) view.findViewById(R.id.field); 
      field = fields.get(position); 

     }else{ 
      view= (View) convertView; 
     } 

     return view; 
    } 

ответ

0

Ничто не заставляет вас надуть все детали, когда getView() называется. Вместо этого вы можете создать/получить список представлений при создании адаптера и вернуть их.

Так пример этого был бы:

public class TileAdapter extends BaseAdapter { 

    List<View> views = new ArrayList<>(); 

    public void setViews(@NonNull List<View> views) { 
     this.views = views; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return views.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return views.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     return views.get(i); 
    } 
} 
+0

Я не понимаю. Что это за виды и как надуть эти кнопки из списка? –

+0

Взгляд можно раздуть, как вы делали в 'inflater.inflate (R.layout.field_layout, null);' Вы можете раздуть их в своей деятельности и передать их адаптеру или конструктору адаптера. Возможно, вам стоит прочитать это, прежде чем продолжить - http://www.vogella.com/tutorials/AndroidCustomViews/article.html –

+0

Хорошо, спасибо. Я начну с чтения этого –