安卓下拉框如何设置默认文本

8

我已经在我的应用程序中实现了一个旋转器。我正在显示学校列表,但我想要一个默认值/提示,以便用户知道选择哪所学校。我还想这样做,而不必将提示作为列表项。有什么想法吗?

以下是我的旋转器代码:

selectSchoolSpinner = (Spinner) findViewById(R.id.select_school_spinner);
spinnerSchoolList = new ArrayList<String>();

spinnerSchoolList.add("Please select School"); 
//I don't want to have a prompt like the latter     

ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
    android.R.layout.simple_spinner_item, spinnerSchoolList);

spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

selectSchoolSpinner.setAdapter(spinnerAdapter);
3个回答

20

你应该创建自定义ArrayAdapter,在其构造函数中使用String类型的数据表示你想要的文本。然后,你应该将你数组的第一个元素替换为你的默认文本,在用户点击下拉列表之后,它应该切换回原始数组。

示例:

Activity类:

    public class SpinnerActivity extends Activity {

    Spinner spinner;
    String defaultTextForSpinner = "Your deafult text here";
    String[] arrayForSpinner = {"One", "Two", "Three"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_spinner);

        spinner = (Spinner) findViewById(R.id.your_spinner);
        spinner.setAdapter(new CustomSpinnerAdapter(this, R.layout.spinner_row, arrayForSpinner, defaultTextForSpinner));
    }
    }

CustomSpinnerAdapter类:

    public class CustomSpinnerAdapter extends ArrayAdapter<String>{

    Context context;
    String[] objects;
    String firstElement;
    boolean isFirstTime;

    public CustomSpinnerAdapter(Context context, int textViewResourceId, String[] objects, String defaultText) {
        super(context, textViewResourceId, objects);
        this.context = context;
        this.objects = objects;
        this.isFirstTime = true;
        setDefaultText(defaultText);
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        if(isFirstTime) {
            objects[0] = firstElement;
            isFirstTime = false;
        }
        return getCustomView(position, convertView, parent);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) { 
        notifyDataSetChanged();
        return getCustomView(position, convertView, parent);
    }

    public void setDefaultText(String defaultText) {
        this.firstElement = objects[0];
        objects[0] = defaultText;
    }

    public View getCustomView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.spinner_row, parent, false);
        TextView label = (TextView) row.findViewById(R.id.spinner_text);
        label.setText(objects[position]);

        return row;
    }

    }

我在 getCustomView 方法上遇到了错误。R.id.tremps_spinner_row 和 R.id.tremps_spinner_text 是什么? - Muhammad Irfan
请再次检查我的答案,我已经编辑过了。 spinner_row是Spinner项目的布局。 spinner_text是spinner_row布局中的TextView。 - Alon Levanon
我需要单独添加整个“自定义适配器”代码吗? - Moeez
在我看来,将textViewResourceId的引用保留在传递给构造函数时会更加清晰,而不是在getCustomView方法中再次引用它。 - Mr.Q
我在这方面遇到了问题,即使第一个选项可见,在下拉列表中无法选择它,当我点击第二个选项后,onItemSelected被激活。 - ashishdhiman2007

13

2
       @Override
    protected void onPostExecute(PositionBean[] result) {
        String[] spinnerArray = new String[result.length];

        if(result!=null) {

            for (int i = 0; i < result.length; i++) {

                String positionName = result[i].getPositionName();
                spinnerArray[i] = result[i].getPositionName();

            }
            ArrayList<String> positionList = new ArrayList<String>(Arrays.asList(spinnerArray));
            positionList.add(0,"select");
            String [] positions = positionList.toArray(new String[positionList.size()]);

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(EngineActivity.this, android.R.layout.simple_spinner_item,
                    positions);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            positionSpinner.setAdapter(adapter);
        }else{
            Log.d("NULL", "This is null");
        }

    }

稍微调整一下数组就解决了问题,希望这能帮到别人。 - Tras Ngahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接