2014-08-03 1 views
0

Я работаю в значительной степени с ListViews и ExpandableListViews в android. И я знаю, как заполнять списки с изображениями и текстом, создавая один customAdaper - и adapterclass, расширяющий, например, Arrayadapter.Populate ArrayList с представлениями при использовании объекта Spinner

В этом приложении я разрабатываю теперь, когда я использую Spinner togehter с ArrayAdapter. В подклассе ArrayAdapter я переопределяю getView-метод для заполнения представлений текстом и изображениями.

Но проблема в том, что getView вызывается только один раз - для первого списка отображается, когда приложение запускается и при выборе элемента из списка. Здесь он работает. Но когда я расширяю список через список, метод getView НЕ вызывается - только имена из строки помещаются в список

Строка [] string = {"ssun", "venus", "earth", " "Март"};

Я хочу, чтобы иметь полный контроль над представлениями, чтобы я мог заполнить весь список своими собственными значками, текстом и т. Д. - как это было с объектами ListView и Expandable ListView.

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

В классе, который расширяет активность

Spinner spinner = (Spinner) findViewById(R.id.planets_spinner); 

String[] string = {"sun", "venus", "earth", "march"}; 
MyArrayAdapter adapter = new MyArrayAdapter(this, string); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinner.setAdapter(adapter); 

И в CustomAdapter

public class MyArrayAdapter extends ArrayAdapter <String> { 

    private final String[] values; 
    private final Context context; 

    public MyArrayAdapter(Context context, String[] values) { 
     super (context, R.layout.celestial_list, values); 
     this.values = values; 
     this.context = context; 
    } 

    private static class ViewHolder { 
     TextView textView; 
     ImageView imageView; 
     ImageView infoView; 
    } 

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


     View view = null; 
     ViewHolder viewHolder; 

     if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.celestial_list, parent, false); 
     viewHolder = new ViewHolder(); 
     viewHolder.textView = (TextView) view.findViewById(R.id.label); 
     viewHolder.imageView = (ImageView) view.findViewById(R.id.icon); 
     view.setTag(viewHolder); 
     } else { 
      view = convertView; 
      viewHolder = (ViewHolder) view.getTag(); 
     } 

     System.out.println("view = " + view + " för position " + position); 
     viewHolder.textView.setText(values[position]); 

      switch (position) { 
     case 0: 
      viewHolder.imageView.setImageResource(R.drawable.sun); 
      break; 
     case 1: 
      viewHolder.imageView.setImageResource(R.drawable.sun); 
      break; 
     case 2: 
      viewHolder.imageView.setImageResource(R.drawable.sun); 
      break; 
     case 3: 
      viewHolder.imageView.setImageResource(R.drawable.sun); 
      break; 
     } 


     return view; 
} 

} 

Скриншот 1. Кажется, хорошо - GetView называется ...

enter image description here

Скриншот 2, но только для выбранного списка - не для остальных. Только String [] используются здесь

enter image description here

ответ

0

Я полагаю, (в основном уверены) вы не используете фрагменты, следовательно, вы на самом деле не нужен пользовательский адаптер для счетчика, чтобы изменить изображение, где оба проживают внутри одного действия.

в http://developer.android.com/guide/topics/ui/controls/spinner.html, вы должны

  • убедитесь, что ваш класс активности implements OnItemSelectedListener,
  • добавить onItemSelected и при необходимости onNothingSelected, положить
  • изображение кода селектор входа в onItemSelected (не забудьте использовать parent.getItemAtPosition(pos) для получить текущую позицию).
0

Spinner адаптеры работают немного иначе:

Вы должны добавить:

public class MyArrayAdapter extends BaseAdapter implements SpinnerAdapter { 

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

    if (convertView == null) { 
     convertView = newDropDownView(parent); 
    } 

    bindDropDownView(position, convertView); 
    return convertView; 

} 

protected View newDropDownView(ViewGroup parent) { ... } 

protected void bindDropDownView(int position, View view) { ... } 


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


} 

Так GetView() будет вызываться для текущего выбранного элемента, который виден, когда вертушка является не расширен.Пока getDropDownView() будет вызываться для каждого элемента в списке счетчика. Вот что вы ищете.

КПП. вот некоторые полезные классы адаптеров (использует кинжал для инъекции зависимостей, но вы можете просто скопировать код и стереть класс Injector): https://github.com/sockeqwe/appkit/tree/master/adapter/src/main/java/com/hannesdorfmann/appkit/adapter

+0

ok спасибо - но я получаю ** IllegalStateException: для ArrayAdapter требуется идентификатор ресурса textView. ** Вероятно, там, где я делаю супер-вызов конструктора базового класса, в котором передается ресурс. Я передаю весь макет. Это нормально, если я использую метод getView. Но теперь, когда я использую метод getDropDownView, я получаю это исключение и сбой. Вопрос в том, как я получаю текст? Мне нужно раздувать xml-файл, как и в getView? – user3155478

+0

Используйте 'BaseAdapter' вместо' ArrayAdapter', а затем в newDropDownView() вам нужно раздуть ваш XML-макет (настроить ViewHolders и т. Д.) ... – sockeqwe

+0

Я изменил на BaseAdapter, но теперь проблема в том, что getView и getDropDownView не называется. И я больше не могу использовать setDropDownViewResource(); – user3155478

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

  • Нет связанных вопросов^_^