【问题标题】:Custom Spinner Adapter自定义微调器适配器
【发布时间】:2012-09-26 10:30:31
【问题描述】:

我想为我的微调器应用自定义字体。我发现的唯一方法是创建一个自定义适配器。这是我的代码

    private class CustomAdapter extends ArrayAdapter {

    private Context context;
    private List<CharSequence> itemList;
    public CustomAdapter(Context context, int textViewResourceId,List<CharSequence> itemList) {

        super(context, textViewResourceId);
        this.context=context;
        this.itemList=itemList;
    }

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

        TextView v = (TextView) super
                .getView(position, convertView, parent);
        Typeface myTypeFace = Typeface.createFromAsset(context.getAssets(),
                "fonts/gilsanslight.otf");
        v.setTypeface(myTypeFace);
        v.setText(itemList.get(position));
        return v;
    }

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

        TextView v = (TextView) super
                .getView(position, convertView, parent);
        Typeface myTypeFace = Typeface.createFromAsset(context.getAssets(),
                "fonts/gilsanslight.otf");
        v.setTypeface(myTypeFace);
        v.setText(itemList.get(position));
        return v;
    }

}

然后我用

List<CharSequence> itemList = new ArrayList<CharSequence>(
            Arrays.asList(items));

    mySpinnerArrayAdapter = new   CustomAdapter(context,android.R.layout.simple_spinner_item,itemList); 
    spinner.setAdapter(mySpinnerArrayAdapter);

这样做之后,我的适配器是空的。谁能帮帮我吗 ?这些项目包含国家/地区列表。

亲切的问候,

【问题讨论】:

    标签: android


    【解决方案1】:

    试试

    public View getView(int position, View convertView, ViewGroup parent) {
    
        LayoutInflater inflater = getLayoutInflater();
                View row = inflater.inflate(yourRowlayout, parent,
                        false);
           TextView make = (TextView) row.findViewById(R.id.Make);
            Typeface myTypeFace = Typeface.createFromAsset(context.getAssets(),
                    "fonts/gilsanslight.otf");
            v.setTypeface(myTypeFace);
            v.setText(itemList.get(position));
            return row;
        }
    
    
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
    
            LayoutInflater inflater = getLayoutInflater();
                    View row = inflater.inflate(yourRowlayout, parent,
                            false);
               TextView make = (TextView) row.findViewById(R.id.Make);
                Typeface myTypeFace = Typeface.createFromAsset(context.getAssets(),
                        "fonts/gilsanslight.otf");
                v.setTypeface(myTypeFace);
                v.setText(itemList.get(position));
                return row;
            }
    

    【讨论】:

    • 你可以在构造函数中获取一次充气机,然后再重复使用。
    • 有没有办法不使用自定义适配器,而是使用 setDropDownResource 来做到这一点?
    • 我还建议对 convertview 进行检查,并且仅在 convertview == null 时才进行膨胀,因为为了提高效率,这是 ArrayAdapters 内部所做的。
    • 两者的参数是相同的,也是身体。那么,为什么不从 getView 调用 getDropDownView 呢?或相反亦然?干燥
    • 感谢getDropDownView()。奇怪,但是很多教程都跳过了这个方法。在我的情况下,当微调器展开时,它显示 item.toString() 而不是项目内的字符串(字段)。同意@ValMartinez,您可以重构代码并提取创建TextView 的方法,甚至可以从getDropDownView() 调用getView()
    【解决方案2】:

    在超类构造函数中将 itemList 作为参数传递

    public CustomAdapter(Context context, int textViewResourceId,List<CharSequence> itemList) {
    
        super(context, textViewResourceId, itemList);
        this.context=context;
        this.itemList=itemList;
    }
    

    【讨论】:

      【解决方案3】:

      我认为是最简单的:)

      List<String> listOfItems = getListOfItems(); // returns ArrayList<String>
      
      ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, listOfItems);
      
      targetSpinner.setAdapter(spinnerAdapter);
      

      好的,简单地将字符串列表放入微调器中不应强迫我们实现适配器。我认为这是一个代码污点,而且模式有点疯狂。

      技巧是 simple_spinner_item id - 该死,我喜欢 R.id 机制,但这在文档中并不直观。

      【讨论】:

        【解决方案4】:

        试试这个

        在您的布局文件中:

        <Spinner
             android:id="@+id/spinnerview"
             android:layout_width="180dp"
             android:layout_height="42dp"
             android:layout_marginLeft="105dp"
             android:layout_marginTop="45dp"
             android:background="@drawable/spinner_back"
             android:paddingLeft="5dp"
             android:spinnerMode="dropdown"
             android:visibility="visible" />
        

        在您的 string.xml 内:

         <string-array name="spinner_array_environtment">
                <item>Test</item>
                <item>Production</item>
         </string-array>
        

        onCreate() 中的Java 文件中@ 方法:

        spinner_environment = (Spinner) findViewById(R.id.spinnerview);
                    adapter = ArrayAdapter.createFromResource(this,
                            R.array.spinner_array_environtment, R.layout.spinner);
                    adapter.setDropDownViewResource(R.layout.spinner);
                    spinner_environment.setAdapter(adapter);
        

        将新的spinner.xml 文件添加到您的布局文件夹中:

        spinner.xml 文件内:

        <?xml version="1.0" encoding="utf-8"?>
        <TextView xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/spinnerTarget"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="25dp"
            android:textColor="#4C4646" />
        

        就是这样!!!

        【讨论】:

          【解决方案5】:

          这对我有用(使用 android.R.layout.simple_spinner_dropdown_item):

          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
              CheckedTextView checkedTextView = (CheckedTextView) super.getView(position, convertView, parent);
              checkedTextView.setText(itemList.get(position));
              return checkedTextView;
          }
          

          我认为这是一个更好的解决方案,因为您不会多次充气。

          【讨论】:

          • 其实,simple_spinner_dropdown_item 无论如何都被充气了多次,所以为什么不给你的自定义视图充气...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多