微调器和微调器项目的不同视图?

Mar*_*tyn 16 android view spinner

有什么办法可以为闭合的微调器视图和微调器项视图设置不同的视图吗?

我假设在其中使用的资源id ArrayAdapter将用于闭合项目视图以及项目视图,因此我扩展了ArrayAdapter并定义了getView使用不同资源的资源,但是对超级构造函数的调用中的资源ID没有似乎永远都没有使用,只使用了getView似乎使用的资源ID

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);
}
Run Code Online (Sandbox Code Playgroud)

叫来:

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));
Run Code Online (Sandbox Code Playgroud)

**编辑**

使用的资源ID是itemViewResourceIdgetView方法中定义的- 添加一个新方法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;
    }
Run Code Online (Sandbox Code Playgroud)

Ian*_*Ian 20

如果实施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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • +1,重点是覆盖BaseAdapter的getDropDownView的默认实现.否则它会调用getView. (2认同)

lou*_*sbl 5

虽然这是一个老问题,但我偶然发现了试图解决同样的问题.我用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);
Run Code Online (Sandbox Code Playgroud)