【问题标题】:Set Spinner selection programmatically以编程方式设置微调器选择
【发布时间】:2017-08-21 23:25:03
【问题描述】:

我在设置微调器选择时遇到问题。这是我正在做的事情: 我有一个 XML,其中有一个按钮和一个填充有国家名称的微调器。我没有使用适配器来填充微调器,而是在 values 文件夹中的字符串文件中命名了一个数组,其中有很多项目作为国家名称。现在在选择一个国家时,假设我选择英格兰并单击按钮。单击一个新活动将开始,该活动也有一个微调器,该微调器以相同的方式填充相同的列表。但我想要的是第二个活动微调器应该显示在这种情况下为英格兰的选定国家作为微调器中的当前项目。 但我无法解决。 这是我所做的一段代码

//第一个活动XML

<Spinner
   android:id="@+id/spinner1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:entries="@array/sehirler"
   android:prompt="@string/sehirsec" />

//第二个活动XML

<Spinner
   android:id="@+id/spinner2"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:entries="@array/sehirler"
   android:prompt="@string/sehirsec" />

//第一个活动代码

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

button.setOnClickListener(new OnClickListener() { 
    @Override
    public void onClick(View arg0) {
        spinnerItem = spinner .getSelectedItem().toString();

        Intent intent = new Intent(firstactivity.this, secondactivty.class); 
        intent.putExtra("name", spinnerItem);
        startActivity(intent);
    }
}); 

//第二个活动代码

sehir = (Spinner)findViewById(R.id.spinner2);
Intent intent = getIntent();
String name2 = intent.getExtras().getString("name");

sehir.setSelection(getIndex(sehir, name2));

private int getIndex(Spinner spinner, String myString) {
    int index = 0;

    for (int i=0;i<spinner.getCount();i++) {
        if (spinner.getItemAtPosition(i).equals(myString)) {
           index = i;
        }
    }
        return index;
    }
}

【问题讨论】:

  • 我已经尝试过你的代码,它对我一直运行良好,一直到 Gingerbread。当您创建方法“private int getIndex(Spinner spinner etc...”时,您是在 onCreate 之外创建方法...对吗?
  • 是的,在 onCreate 之外。我为你工作得好吗?
  • 是的,它对我有用,你能发布你的完整代码,或者私信我
  • 请PM我,我不知道该怎么做,哈哈
  • 给我发电子邮件 andrewelmasry@gmail.com

标签: android xml android-layout


【解决方案1】:

您的 spinner2 似乎不在第二个活动中,而是在完全不同的布局中。检查并查看是否有适配器。如果您有自定义适配器,则必须将该位置值传递给自定义适配器的构造函数。

在您的第二个活动中,将位置值传递给 CustomAdapter 构造函数:

Intent intent = getIntent();
position = intent.getIntExtra("position", 0);

CustomAdapter jsonCustomAdapter = new CustomAdapter(SecondActivity.this, list, position);

在您的 CustomAdapter 中,像这样设置它:

public class CustomAdapter extends BaseAdapter {

    private LayoutInflater inflater;
    private List<ItemObject> list;
    private int spinnerPosition;

    public CustomAdapter(Context context, List<ItemObject> list, int position) {
        inflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.list = list;
        spinnerPosition = position;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        ViewHolder listViewHolder;
        if(convertView == null){
            listViewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.list, parent, false);
            listViewHolder.spinner = (Spinner)convertView.findViewById(R.id.spinner2);
            convertView.setTag(listViewHolder);
        } else {
           listViewHolder = (ViewHolder)convertView.getTag();
        }

        listViewHolder.spinner.setSelection(spinnerPosition);
        return convertView;
    }

    static class ViewHolder{
        Spinner spinner;
    }
}

【讨论】:

  • 这不是一回事吗?我正在通过您在内部执行的 onCreate 之外的函数找到索引
  • 我发现了问题,您的 spinner2 不在第二个活动中,而是在您的自定义适配器中处于完全不同的布局中,因此您必须将位置传递给自定义适配器的构造函数。我会为你编辑我的答案。
  • 非常感谢。请也评价我的问题
猜你喜欢
  • 2012-06-19
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多