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

时间:2011-09-21 11:04:27

标签: android view spinner

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

我假设ArrayAdapter中使用的资源ID将用于已关闭的项目视图以及项目视图,因此我扩展了ArrayAdapter并定义了getView它使用不同的资源,但是对超级构造函数的调用中的资源ID似乎从未使用过,只有getView中使用的资源ID似乎被使用

Spinner.java code中声明:

  

微调器适配器允许定义两个不同的视图:一个用于显示微调器本身的数据,另一个用于在按下微调器时显示下拉列表中的数据。

但鉴于代码,它似乎不可能。

无论如何 - 我的代码:

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

**编辑**

使用的资源ID是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 个答案:

答案 0 :(得分: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;
        }
    }

答案 1 :(得分: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);

答案 2 :(得分:2)

实际上,为扩展(打开)和折叠(关闭)View获取不同的Spinner就像覆盖适配器的getViewgetDropdownView方法一样简单。< / p>

getView(int position, View convertView, ViewGroup parent) 会生成View折叠时用于显示所选项目的所有Spinner

当您点击getDropDownView(int position, View convertView, ViewGroup parent)进行展开并显示商品的下拉列表列表时,会调用 {strong> 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;
}

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

//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;
    }

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