【问题标题】:Set spinner selected item text设置微调器选定项文本
【发布时间】:2015-11-12 10:10:09
【问题描述】:

我有一个微调器(仅代码的相关部分)...

protected void onCreate(Bundle savedInstanceState) {

   Spinner to_spinner = (Spinner) findViewById(R.id.to_spinner);
   List<Unit> list = myDbHelper.getAllUnits();
   SpinnerUnitAdapter tUnitAdapter tUnitAdapter = new SpinnerUnitAdapter(this, android.R.layout.simple_spinner_item, list);

   to_spinner.setAdapter(tUnitAdapter);
   to_spinner.setOnItemSelectedListener(onItemSelectedListenerTo);
}

使用 onItemSelectedListener

AdapterView.OnItemSelectedListener onItemSelectedListenerTo = new     AdapterView.OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view,
                               int position, long id) {

        // do stuff
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapter) {
    }
};

当一个项目被选中时(即它说:“做东西”),我想设置/更改所选微调器项目的文本。 (请注意,这与设置微调器位置(使用 setSelection())不同

我正在考虑这样做

tUnitAdapter.getView(position, ?, ?).setText("new text");

我在正确的轨道上吗?在 getView 中放置什么作为第二个(“convertView”)和第三个(“父”)参数。我的微调器适配器如下所示:

public class SpinnerUnitAdapter extends ArrayAdapter<Unit> {
     ...
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
         TextView label = new TextView(mContext);
         label.setTextColor(Color.BLACK);                        
       label.setTextSize(mContext.getResources().getDimension(R.dimen.list_row_font_size));
         label.setGravity(Gravity.CENTER);
         label.setText(getItem(position).getName());

         return label;
    }
}

【问题讨论】:

    标签: android android-spinner settext onitemselectedlistener


    【解决方案1】:

    我走对了吗?

    没有。您应该执行以下步骤:(在onItemSelected 方法中)

    • 更新您的模型(您传递给适配器的项目数组),以便 position 索引处的项目采用新名称。

    • 在适配器对象上发出 notifyDataSetChanged。或者,您可以通过((TextView) view).setText(new_name);

    • 手动执行此操作

    注意:onItemSelected 方法中,adapterView 指向您的微调器视图,view 指向刚刚选择的行视图。


    更新 #1

    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
        ((TextView) view).setText("new name");
    }
    

    更新 #2

    为此,您应该使用 Java 接口来实现一个回调,该回调会在对话框关闭时调用。

    public void onItemSelected(AdapterView<?> adapterView, final View view, int position, long id) {
        Dialog dialog = new MyDialog(context, new MyDialog.OnItemSelectListener(){
            @Override
            public void onItemSelected(String newName){
                ((TextView) view).setText(newName);
            }
        });
        dialog.show();
    }
    

    并在MyDialog 类中声明接口OnItemSelectListener

    【讨论】:

    • 感谢您的回复。我真的不想更改基础数据,因为它们属于不同的类型。从用户体验来看,我试图实现的是一个带有子菜单/对话框的微调器,即用户选择一个微调器项目(比如“汽车”),这会打开一个带有多项选择的对话框(比如“梅赛德斯”、“保时捷“……)。用户在对话框/子菜单中选择一个项目(例如“VW”)后,对话框/子菜单将关闭,并且在微调器中应该显示“VW”(而不是“汽车”)。
    • @user1583209 好的。这很简单。看看我的编辑。
    • 这比我下面的解决方案还要简单。谢谢。现在我只需要以某种方式将此 setText 移动到我的对话框中,以便仅在选择对话框项后执行它。我应该以某种方式传递“视图”(如何?)?
    【解决方案2】:

    您可以在单击每个项目时更改微调器的文本,因此您应该实现 onClickListener

    public class SpinnerUnitAdapter extends ArrayAdapter<Unit> {
             ...
             @Override
             public View getView(int position, View convertView, ViewGroup parent) {
                 TextView label = new TextView(mContext);
                 ...
                 label.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                      // change label text here
                      // label.setText(...);
                    }
                 });
                 return label;
            }
        }
    

    希望有帮助

    【讨论】:

      【解决方案3】:

      我想我找到了解决方案。我只能这样做:

      public void onItemSelected(AdapterView<?> adapterView, View view,
                                     int position, long id) {
          TextView tv = (TextView) adapterView.getSelectedView();
          tv.setText("new text");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-07
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多