Вам необходимо создать пользовательский адаптер Spinner
и переопределить getView()
, чтобы установить цвет и текст каждого элемента.
Здесь я обертываю цвета вокруг массива цветов с помощью оператора модуля (% ) во избежание IndexOutOfBoundsExecption
, если элементы больше доступных цветов.
Пользовательский адаптер
public class ColorAdapter extends BaseAdapter {
private ArrayList<Integer> mColors;
private String[] mItems;
ColorAdapter2(String[] items) {
mItems = items;
String[] hex = {"#886da8", "#ffc3cf", "#ef9b00", "#2bb430", "#f7dc01", "#bc65a2", "#487ebf", "#e00124", "#b36634", "#949494", "#ffffff", "#000000", "#4bbbd0", "#8b6d9f", "#8ccff4"};
mColors = new ArrayList<>();
for (String color : hex) {
mColors.add(Color.parseColor(color));
}
}
@Override
public int getCount() {
return mItems.length;
}
@Override
public Object getItem(int args) {
return mColors.get(args);
}
@Override
public long getItemId(int args) {
return args;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, null);
holder = new ViewHolder();
holder.textView = convertView.findViewById(android.R.id.text1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setBackgroundColor(mColors.get(position % mColors.size()));
holder.textView.setText( mItems[position]);
return convertView;
}
/* Return spinner text of the item at particular position*/
public String getItemAtPosition(int position) {
if (position > -1 && position < mItems.length)
return mItems[position];
else
return null;
}
static class ViewHolder {
TextView textView;
}
}
Использование
Spinner spinner = findViewById(R.id.spinner);
spinner.setAdapter(new ColorAdapter(getResources().getStringArray(R.array.myItems)));
строк. xml
<resources>
<string name="app_name">Color Activity</string>
<string-array name="myItems">
<item>item1</item>
<item>item2</item>
<item>item3</item>
<item>item4</item>
<item>item5</item>
</string-array>
</resources>
Результат
Редактировать
Как получить текст выбранного элемента? spinner.getItemAtPosition (spinner.getSelectedItemPosition ()). toString () больше не работает. Возвращаемое значение представляет собой большое число.
Теперь, когда мы создали собственный адаптер, вам нужно настроить любые связанные данные, и вы не можете полагаться на API адаптера Spinner по умолчанию; поэтому я добавил выше getItemAtPosition()
метод в пользовательском адаптере, который принимает позицию и возвращает текст этого элемента.
Использование
String item = ((ColorAdapter)spinner.getAdapter()).getItemAtPosition(position));
И вы можете получить его, когда выбран предмет:
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemSelected: " +
((ColorAdapter)spinner.getAdapter()).getItemAtPosition(position));
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});