如何制作带有初始文本“Select One”的Android Spinner?

Posted

技术标签:

【中文标题】如何制作带有初始文本“Select One”的Android Spinner?【英文标题】:How to make an Android Spinner with initial text "Select One"? 【发布时间】:2010-10-26 10:25:50 【问题描述】:

我想使用最初(当用户尚未做出选择时)显示文本“选择一个”的 Spinner。当用户单击微调器时,将显示项目列表并且用户选择其中一个选项。用户做出选择后,所选项目会显示在 Spinner 中,而不是“Select One”。

我有以下代码来创建 Spinner:

String[] items = new String[] "One", "Two", "Three";
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

使用此代码,最初会显示项目“One”。我可以在项目中添加一个新项目“Select One”,但随后“Select One”也会作为第一项显示在下拉列表中,这不是我想要的。

我该如何解决这个问题?

【问题讨论】:

完美的解决方案在于这个问题:***.com/questions/9863378/…只需覆盖getDropDownView()方法。 您是否尝试将适配器的第一个元素设置为“选择一个”? [这里有其他很棒的解决方案!][1] [1]: ***.com/questions/9863378/… 可重复使用的微调器:github.com/henrychuangtw/ReuseSpinner android--code.blogspot.in/2015/08/android-spinner-hint.html 又一个好教程 【参考方案1】:
public AdapterView.OnItemSelectedListener instructorSpinnerListener = new AdapterView.OnItemSelectedListener() 
    @Override
    public void onItemSelected(AdapterView << ? > adapterView, View view, int i, long l) 
        String selectedInstructorName = adapterView.getItemAtPosition(i).toString();
        if (selectedInstructorName.equals("[Select Instructor]")) 
            instructorSpinnerAdapter.clear();
            for (Offering offering: allOfferingsList)
                instructorSpinnerAdapter.add(offering);
         else 
            instructorSpinnerAdapter.clear();
        
    

    @Override
    public void onNothingSelected(AdapterView<< ? > adapterView) 
        adapterView.setSelection(0);

        // Toast.makeText(getApplicationContext(), "Why?", Toast.LENGTH_SHORT).show();
    
;

【讨论】:

【参考方案2】:

如果您遇到此问题当您的项目是从数据库光标填充时

我在this SO answer中找到的最简单的解决方案:

在您的游标适配器查询中使用 UNION 并将 id= -1 的附加项添加到查询结果中,而不是真正将其添加到数据库中:

类似:

db.rawQuery("SELECT iWorkerId as _id, nvLastName as name  FROM  Worker
w  UNION  SELECT -1 as _id , '' as name",null);

如果选择的项目是-1,那么它是默认值。否则 这是表格中的记录。

【讨论】:

【参考方案3】:
String[] listAges = getResources().getStringArray(R.array.ages);

        // Creating adapter for spinner
        ArrayAdapter<String> dataAdapter =
                new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, listAges);

        // Drop down layout style - list view with radio button
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // attaching data adapter to spinner
        spinner_age.getBackground().setColorFilter(ContextCompat.getColor(this, R.color.spinner_icon), PorterDuff.Mode.SRC_ATOP);
        spinner_age.setAdapter(dataAdapter);
        spinner_age.setSelection(0);
        spinner_age.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
                String item = parent.getItemAtPosition(position).toString();

                if(position > 0)
                    // get spinner value
                    Toast.makeText(parent.getContext(), "Age..." + item, Toast.LENGTH_SHORT).show();
                else
                    // show toast select gender
                    Toast.makeText(parent.getContext(), "none" + item, Toast.LENGTH_SHORT).show();
                
            
            @Override
            public void onNothingSelected(AdapterView<?> parent) 
            
        );

【讨论】:

【参考方案4】:
private boolean isFirst = true;
private void setAdapter() 
    final ArrayList<String> spinnerArray = new ArrayList<String>();     
    spinnerArray.add("Select your option");
    spinnerArray.add("Option 1");
    spinnerArray.add("Option 2");
    spin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
            TextView tv = (TextView)selectedItemView;
            String res = tv.getText().toString().trim();
            if (res.equals("Option 1")) 
            //do Something
         else if (res.equals("Option 2")) 
            //do Something else
        
        

        @Override
        public void onNothingSelected(AdapterView<?> parentView)  

    );
            
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_spinner_style,spinnerArray) 
         public View getView(int position, View convertView, ViewGroup parent) 
             View v = super.getView(position, convertView, parent);
             int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, getResources().getDisplayMetrics());                  
             ((TextView) v).setTypeface(tf2);
             ((TextView) v).getLayoutParams().height = height;
             ((TextView) v).setGravity(Gravity.CENTER);
             ((TextView) v).setTextSize(TypedValue.COMPLEX_UNIT_SP, 19);
             ((TextView) v).setTextColor(Color.WHITE);
             return v;
         

         public View getDropDownView(int position, View convertView,
                 ViewGroup parent) 
             if (isFirst) 
                 isFirst = false;
                 spinnerArray.remove(0);
             
             View v = super.getDropDownView(position, convertView, parent);                  
             ((TextView) v).setTextColor(Color.argb(255, 70, 70, 70));
             ((TextView) v).setTypeface(tf2);
             ((TextView) v).setGravity(Gravity.CENTER);
             return v;
         
     ;
     spin.setAdapter(adapter);

【讨论】:

【参考方案5】:

考虑有 N 个项目可供选择。

添加这N项后,将提示文本添加为​​第(N+1)项。

将所选项目设置为第 N 个位置 [(N+1) 个项目]。

在您的 OnItemSelected Listener 中,如果选中的位置不是 N,则弹出最后一项并调用 Adapter.notifyDataSetChanged() 并将选中的项目设置为选中的位置。

类似这样的:

    spinner.setItems("Daily", "One time", "Frequency"); // here "Frequency is the hint text"
    spinner.setSelectedIndex(2);

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() 
        @Override
        public void onItemSelected(Spinner view, int position, long id, Object item) 
            if (position != 2) 
                view.setItems("Daily", "One time");
                view.setSelectedIndex(position);
            else 
                // This item is not a valid selection
            
        
    );

【讨论】:

【参考方案6】:
 ArrayList<String> sizes = new ArrayList<>();

 spinner = (Spinner) findViewById(R.id.spinner_size);

    if (sizes != null && !sizes.isEmpty()) 

        //SORT ArrayList If You Want Data in ASC or DSC Order

        sizes.add("28");
        sizes.add("29");
        sizes.add("31");

        sizes.add("Choose Size"); //adding String at the end of ArrayList
        Collections.reverse(sizes); //Last Item Will Be Shown As A Spinner Title

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, sizes);
        spinner.setAdapter(adapter);

只需使用 arraylist.add("Your Data") 方法在 arrayList 的末尾添加项目,然后使用 Collection.reverse(arrayList) 将其反转,以便标题成为 Spinner 中的第一个项目。您也可以在最后添加数据之前对项目进行排序。

【讨论】:

这个答案没有为问题添加任何新内容。已经提出了这种方法,添加相同的答案只会产生噪音。请在发布新答案之前阅读以前的答案。

以上是关于如何制作带有初始文本“Select One”的Android Spinner?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作带有圆形图像和圆形文本的 UI,以及在同一个圆圈上添加评级图标。在 iOS 应用程序中

如何制作自定义 TextView?

如何创建带有图标和文本的 JList?

如何在c#中制作带圆角的文本框?

如何使 QPushButtons 将文本添加到 QLineEdit 框中?

如何使用 BaseAdapter 刷新带有文本和图像的列表视图?