私はこのような配列リストを持っています:
private ArrayList<Locations> Artist_Result = new ArrayList<Location>();
このLocationクラスには、id
とlocation
の2つのプロパティがあります。
ArrayList
をスピナーにバインドする必要があります。私はこの方法を試しました:
Spinner s = (Spinner) findViewById(R.id.SpinnerSpcial);
ArrayAdapter adapter = new ArrayAdapter(this,Android.R.layout.simple_spinner_item, Artist_Result);
s.setAdapter(adapter);
ただし、オブジェクトの16進値が表示されます。そのため、そのスピナーコントローラーのテキストと値の表示を設定する必要があると思います。
ArrayAdapter
は Object.toString()
- method を呼び出すことにより、Location
- objectsを文字列(16進値を引き起こす)として表示しようとします。デフォルトの実装は次を返します:
[...]オブジェクトがインスタンスであるクラスの名前で構成される文字列、アットマーク文字 `@ '、およびオブジェクトのハッシュコードの符号なし16進表記
ArrayAdadpter
にアイテムリストで実際に役立つものを表示させるには、toString()
メソッドをオーバーライドして、意味のあるものを返すことができます。
@Override
public String toString(){
return "Something meaningful here...";
}
これを行う別の方法は、、拡張することです BaseAdapterおよび実装 SpinnerAdapter =独自のアダプタを作成します。これにより、ArrayList
内の要素がオブジェクトであり、それらのオブジェクトのプロパティを使用する方法がわかります。
私は少し遊んでいて、なんとか動作させることができました。
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create and display a Spinner:
Spinner s = new Spinner(this);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT
);
this.setContentView(s, params);
// fill the ArrayList:
List<Guy> guys = new ArrayList<Guy>();
guys.add(new Guy("Lukas", 18));
guys.add(new Guy("Steve", 20));
guys.add(new Guy("Forest", 50));
MyAdapter adapter = new MyAdapter(guys);
// apply the Adapter:
s.setAdapter(adapter);
// onClickListener:
s.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
/**
* Called when a new item was selected (in the Spinner)
*/
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
Guy g = (Guy) parent.getItemAtPosition(pos);
Toast.makeText(
getApplicationContext(),
g.getName()+" is "+g.getAge()+" years old.",
Toast.LENGTH_LONG
).show();
}
public void onNothingSelected(AdapterView parent) {
// Do nothing.
}
});
}
/**
* This is your own Adapter implementation which displays
* the ArrayList of "Guy"-Objects.
*/
private class MyAdapter extends BaseAdapter implements SpinnerAdapter {
/**
* The internal data (the ArrayList with the Objects).
*/
private final List<Guy> data;
public MyAdapter(List<Guy> data){
this.data = data;
}
/**
* Returns the Size of the ArrayList
*/
@Override
public int getCount() {
return data.size();
}
/**
* Returns one Element of the ArrayList
* at the specified position.
*/
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int i) {
return i;
}
/**
* Returns the View that is shown when a element was
* selected.
*/
@Override
public View getView(int position, View recycle, ViewGroup parent) {
TextView text;
if (recycle != null){
// Re-use the recycled view here!
text = (TextView) recycle;
} else {
// No recycled view, inflate the "original" from the platform:
text = (TextView) getLayoutInflater().inflate(
Android.R.layout.simple_dropdown_item_1line, parent, false
);
}
text.setTextColor(Color.BLACK);
text.setText(data.get(position).name);
return text;
}
}
/**
* A simple class which holds some information-fields
* about some Guys.
*/
private class Guy{
private final String name;
private final int age;
public Guy(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
}
私はコードに完全にコメントしました。質問がある場合は、遠慮なく質問してください。
SOでさまざまなソリューションを調べた後、次のものがSpinner
にカスタムObjects
を入力するための最も単純でクリーンなソリューションであることがわかりました。完全な実装は次のとおりです。
public class Location{
public int id;
public String location;
@Override
public String toString() {
return this.location; // What to display in the Spinner list.
}
}
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:padding="10dp"
Android:textSize="14sp"
Android:textColor="#FFFFFF"
Android:spinnerMode="dialog" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical">
<Spinner
Android:id="@+id/location" />
</LinearLayout>
// In this case, it's a List of Locations, but it can be a List of anything.
List<Location> locations = Location.all();
ArrayAdapter locationAdapter = new ArrayAdapter(this, R.layout.spinner, locations);
Spinner locationSpinner = (Spinner) findViewById(R.id.location);
locationSpinner.setAdapter(locationAdapter);
// And to get the actual Location object that was selected, you can do this.
Location location = (Location) ( (Spinner) findViewById(R.id.location) ).getSelectedItem();
上記のLukasの回答のおかげで(以下?)これを始めることができましたが、私の問題は、彼のgetDropDownView
の実装により、ドロップダウンアイテムがプレーンテキストになり、パディングもナイスグリーンもないことでした。 Android.R.layout.simple_spinner_dropdown_item
を使用するときに取得するようなラジオボタン。
上記のように、getDropDownView
メソッドは次のようになります。
@ Override public View getDropDownView(int position、View convertView、ViewGroup parent) { if(convertView == null) { LayoutInflater vi =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(Android.R.layout.simple_spinner_dropdown_item、null); } TextView textView =(TextView)convertView.findViewById(Android.R.id.text1); textView.setText(items.get(position).getName()); return convertView; }
まあ、詳細と混同しないでください。
ArrayList
を作成して、このように値をバインドするだけです。
ArrayList tExp = new ArrayList();
for(int i=1;i<=50;i++)
{
tExp.add(i);
}
レイアウトにスピナーコントロールがすでにあると仮定すると、id spinner1
。このコードを下に追加します。
Spinner sp = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<String> adp1=new ArrayAdapter<String>this,Android.R.layout.simple_list_item_1,tExp);
adp1.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adp1);
上記のコードはすべてonCreate
関数の下にあります。
ルーカスに感謝します、あなたは私をたくさん助けてくれます。私はあなたの答えを改善したいと思います。選択したアイテムに後でアクセスするだけの場合は、これを使用できます。
Spinner spn = (Spinner) this.findViewById(R.id.spinner);
Guy oGuy = (Guy) spn.getSelectedItem();
そのため、初期化でsetOnItemSelectedListener()を使用する必要はありません:)