Разные взгляды на спиннер и спиннер? - PullRequest
16 голосов
/ 21 сентября 2011

Можно ли каким-то образом установить другое представление для вида закрытого вращающегося элемента и вида элемента вращающегося элемента?

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

В Spinner.javaкод он гласит:

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

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

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

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));

** EDIT **

Используется идентификатор ресурса 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;
    }

Ответы [ 5 ]

20 голосов
/ 24 октября 2011

Если вы реализуете 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;
        }
    }
5 голосов
/ 15 января 2014

Хотя это старый вопрос, я наткнулся на попытку решить ту же проблему. Я использую 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);
2 голосов
/ 13 марта 2014

На самом деле, получить разные View s для развернутого (открытого) и свернутого (закрытого) 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;
}
0 голосов
/ 21 июня 2014
//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;
    }

}
//-------------------------
0 голосов
/ 14 июня 2014
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));
...