Различные виды для прядильщика и элемента с прядильщиками?

Есть ли способ, которым я могу установить другое представление для закрытого представления счетчика и представления элемента spinner?

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

В коде Spinner.java говорится:

Адаптер spinner позволяет определять два разных вида: один, который отображает данные в самом устройстве раскручивателя, и тот, который показывает данные в выпадающем списке при нажатии счетчика.

но это не представляется возможным с учетом кода.

В любом случае - мой код:

public class CustomArrayAdapter <T> extends ArrayAdapter<T> {

    int itemViewResourceId;
    private LayoutInflater inflater;
    ViewPopulator<T> viewPopulator;
    private List<T> objects;

    public CustomArrayAdapter(Context context, int textViewResourceId, int itemViewResourceId, ViewPopulator<T> viewPopulator, List<T> objects) {
        super(context, textViewResourceId, objects);
        inflater = LayoutInflater.from(context);
        this.viewPopulator = viewPopulator;
        this.itemViewResourceId = itemViewResourceId;
        this.objects = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null || convertView.getTag() == null) {
            // new view - populate 
            convertView = inflater.inflate(itemViewResourceId, parent, false);
            convertView.setTag(new Object());
        }
        viewPopulator.populateView(position, convertView, parent, objects.get(position));
        return convertView;
    }
}

public abstract class ViewPopulator<T> {
    public abstract void populateView(int position, View convertView, ViewGroup parent, T item);
}

вызываемый с помощью:

CustomArrayAdapter<T> typeAdapter = new CustomArrayAdapter<T>(context, R.layout.list_item, R.layout.list_item_big, new ViewPopulator<T>() {
        @Override
        public void populateView(int position, View convertView, ViewGroup parent, T item) {
            ((TextView) convertView.findViewById(R.id.list_item)).setText(position + " - " + item.getName());
        }
    }, itemsByType.get(type));

** РЕДАКТИРОВАТЬ **

Используемый идентификатор ресурса - это itemViewResourceId, определенный в методе getView добавление нового метода в CustomArrayAdapter, переопределение getDropDownView, как показано ниже, дает мне те же результаты использования itemViewResourceId для всех стилей, а textViewResourceId вообще не используется. Однако удаление getView приводит к использованию textViewResourceId - поэтому я не думаю, что getDropDownView фактически что-то делает:

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        if(convertView == null || convertView.getTag() == null) {
            // new view - populate 
            convertView = inflater.inflate(itemViewResourceId, parent, false);
            convertView.setTag(new Object());
        }
        viewPopulator.populateView(position, convertView, parent, objects.get(position));
        return convertView;
    }

Ответы

Ответ 1

Если вы реализуете SpinnerAdapter, это поможет? Для меня работает следующий код:

private class CustomSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
        String[] values;
        Context context;

        public NumberSpinnerAdapter(String[] values) {
            this.values = values;
            this.context = context;
        }

        @Override
        public int getCount() {
            return values.length;
        }

        @Override
        public Object getItem(int position) {
            return values[position];
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_item, null);
            textView.setText(values[position]);
            return textView;
        }

        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_dropdown_item, null);
            textView.setText(values[position]);
            return textView;
        }
    }

Ответ 2

Хотя это старый вопрос, я наткнулся на попытку решить ту же проблему. Я использую setDropDownViewResource:

Spinner mySpinner = (Spinner) mView.findViewById(R.id.mySpinner);
ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(...);

myAdapter.setDropDownViewResource(R.layout.my_simple_spinner_dropdown_item);
mySpinner.setAdapter(adapter);

Ответ 3

Собственно, получение разного View для расширенного (открытого) и свернутого (закрытого) Spinner так же просто, как переопределение методов getView и getDropdownView вашего адаптера.

getView(int position, View convertView, ViewGroup parent) создаст все View, которые будут использоваться для отображения выбранного элемента при сбрасывании Spinner.

getDropDownView(int position, View convertView, ViewGroup parent) вызывается при нажатии на Spinner, чтобы развернуть его и отобразить выпадающий список ваших элементов. Вы можете вызвать getView из этого метода (если ваши элементы в расширенных и свернутых состояниях схожи) или создать другой View для элемента в раскрывающемся списке.

Было бы неплохо, если бы вы переопределили оба эти методы (даже если ваш getDropdownView просто вызывает getView с теми же аргументами). И не забудьте использовать ваш параметр convertView - он здесь с целью оптимизации (повторно использовать существующие представления вместо того, чтобы раздувать/создавать их каждый раз):

public View getView(int position, View convertView, ViewGroup parent) {
     ...
     if(convertView == null){
          convertView = View.inflate(getContext(),
                R.layout.dropdown_category_color, null);
     }
     //...do your stuff with your View

     return convertView;
}

Ответ 4

CustomArrayAdapter<T> typeAdapter = new CustomArrayAdapter<T>(context, R.layout.list_item, R.layout.list_item_big, new ViewPopulator<T>() {

        @Override
        public void populateView(int position, View convertView, ViewGroup parent, T item) {
            ((TextView) convertView.findViewById(R.id.list_item)).setText(position + " - " + item.getName());
        }
}, itemsByType.get(type));

Ответ 5

//1---------------
package testing;

public class SpinnerItemAdapterData {

    public int id ;
    public String name;

    public SpinnerItemAdapterData(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId(){
        return this.id;
    }

    public String getName(){
        return this.name;
    }

}
//-------------------------