【问题标题】:how to set selection on spinner based on ID, not index or position如何根据 ID 而不是索引或位置在微调器上设置选择
【发布时间】:2014-04-16 04:05:39
【问题描述】:

我有微调器,它包含 value 和 ID ,如下所示:

ID      message
---     ----
100     Elephant
120     Lion
125     Cat
153     Dog
165     Bear

这是在我的微调器上仅显示价值的方式:

    public class Message {
private Int id;
private String message;
public Int getId() {
    return id;
}
public void setId(Int id) {
    this.id = id;
}
public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}

 @Override
 public String toString() {          
     return  message;
 }

这就是我将消息传递到我的适配器的方式:

 protected List<Message> messages = null;
ArrayAdapter <Message> arrayadapter = new ArrayAdapter<Message>( activity,android.R.layout.simple_spinner_item,messages);               
                    arrayadapter.setDropDownViewResource(R.layout.textview);

spinner1.setAdapter(arrayadapter);

这就是我从选定微调器获取 ID 的方式:

    spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view,
                int pos, long id) {
            Message mSelected = (Message) parent.getItemAtPosition(pos);
            Log.i("Id:", mSelected.getId());

        }
}

问题是当我尝试根据 ID(例如 ID: 165)而不是值或索引来设置微调器时,我尝试了这种方法:

ArrayAdapter myAdap = (ArrayAdapter) spinner1.getAdapter();
        int spinnerPosition = myAdap.getPosition(message.getID());
        spinner1.setSelection(Message.getID());

但它返回错误,所以我的问题是,如何根据他们的 ID 在微调器上设置选择?

【问题讨论】:

标签: java android spinner


【解决方案1】:

如果您使用 _id 字段,这很容易。下面的代码从 Spinner Cursor 中的 _id 字段中获取值,并输出该字段在光标中的位置(例如行号)

//in onCreate or wherever...  iID = your chosen ID.  myOrder = the position to set the spinner
 Spinner mySpinner =(Spinner)findViewById(R.id.someSpinner);
 int iID = 5;  //find the index for the value #5 in your cursor
 int myOrder = getSpinnerIndex(mySpinner,iID);
 mySpinner.setSelection(myOrder);


 //function we are calling from above code.  put it elsewhere in your class.
    private int getSpinnerIndex(Spinner spinner, int mySetId)
    {
        int index = 0;
        for (int i=0;i<spinner.getCount();i++){
            if (spinner.getItemIdAtPosition(i)==mySetId){
                index = i;
                i=spinner.getCount();
            }
        }
        return index;
    }

【讨论】:

    【解决方案2】:

    好吧,我必须做同样的事情,我做了一个名为 SpinnerPosition 的额外 int 并将其添加到我的模型中(就像你的 Message 类)

    然后做了这样的事情:

     spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view,
                int pos, long id) {
            Message mSelected = mSelected.setSpinnerPosition(pos);
            Log.i("Id:", mSelected.getId());
    
        }
    }
    

    所以现在你可以做类似的事情(如果你从某个地方获得了 id)

    ArrayAdapter myAdap = (ArrayAdapter) spinner1.getAdapter();
             if (Message.getID() == id) {
            previousSelected = Message.getSpinnerPosition();
            int spinnerPosition = myAdap.previousSelected;
            spinner1.setSelection(spinnerPosition);
    }
    

    我很快写了代码,所以它可能会出现一些错误,但我希望得到它背后的想法

    【讨论】:

    • ID 中的类型数据是什么?
    • 它是一个 int,因为 Message.getID 是一个 int。但 id 是你从某个地方传递过来的东西。基本思想是将位置存储在消息对象中具有特定 id 的特定消息的微调器中。因此,现在您可以通过 id 查找消息,然后从同一个对象中获取微调器中的位置。我希望这很清楚?
    【解决方案3】:

    使用这个,

     spinner2.setSelection(getIndex(spinner2, Message.getID()));
            spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    
                    String CandidateNos = spinner2.getSelectedItem().toString();
                    System.out.println("Spinner 2:"+CandidateNos);
    
    
                }
                public void onNothingSelected(AdapterView<?> parent) {
                }
            });
    
    
    
     private int getIndex(Spinner spinner, int myString)
     {
      int index = 0;
    
      for (int i=0;i<spinner.getCount();i++){
       if (Integer.parseInt(spinner.getItemAtPosition(i).toString())==myString){
        index = i;
        i=spinner.getCount();//will stop the loop, kind of break, by making condition false
       }
      }
      return index;
     } 
    

    【讨论】:

    • Message.getID()) 是 Int 而不是 String,所以我看不到在哪里可以根据我想要的 ID 选择我的微调器
    • 现在改成 Int 试试
    • 我收到错误,无效整数,供您参考,我的微调器中显示了值,但我的微调器中未显示 ID
    • 使用真正的休息时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2023-04-05
    • 2012-05-24
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多