Страницы

Поиск по вопросам

Показаны сообщения с ярлыком android-spinner. Показать все сообщения
Показаны сообщения с ярлыком android-spinner. Показать все сообщения

понедельник, 30 марта 2020 г.

Изменение кастомного макета для Spinner'a после его создания

#android #ui #android_spinner


Можно ли как-нибудь изменить кастомный макет для Spinner'a после его создания?
Например, у меня есть Spinner, макет которого состоит из TextView и ImageView:











наполнение его выглядит так:

Spinner spinner = findViewById(R.id.spinner_sorting);
        ArrayAdapter spinnerAdapter = new ArrayAdapter(this,
                R.layout.spinner_row, R.id.tv_sorting, getResources().getStringArray(R.array.sorting_array));
        spinner.setAdapter(spinnerAdapter);


и в итоге Spinner выглядит следующим образом:



А мне хотелось бы изменить каждую вторую ImageView в этом Spinnere. Как это можно
сделать?
    


Ответы

Ответ 1



Создала кастомный адаптер для Spinner-a: public class SortingSpinnerAdapter extends ArrayAdapter { private LayoutInflater inflater; private Context context; private String[] data; public SortingSpinnerAdapter(@NonNull Context context, int resource, int textViewResourceId, String[] data) { super(context, resource, textViewResourceId, data); inflater = LayoutInflater.from(context); this.context = context; this.data = data; } @Override public View getView(int position, View convertView, ViewGroup parent) { return createView(position, convertView, parent); } @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { return createView(position, convertView, parent); } private View createView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.spinner_row, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.tv_sorting); holder.imageView = convertView.findViewById(R.id.iv_arrow); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } onBindViewHolder(holder, position); return convertView; } private void onBindViewHolder(ViewHolder holder, int pos) { holder.textView.setText(data[pos]); if (pos % 2 == 0) { holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.arrow_downward)); } else { holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.arrow_upward)); } } static class ViewHolder { TextView textView; ImageView imageView; } } В итоге получила именно то, что хотела:

суббота, 8 февраля 2020 г.

Spinner не устанавливать значение пока не нажму(android)

#java #android #android_spinner


У меня есть spinner:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView parent, View view, int childposition,
long id) {
        textView.setText(spinner.getSelectedItem().toString());
    }

    @Override
    public void onNothingSelected(AdapterView parent) {
        textView.setText("");
    }
    });


У меня есть textView При запуске программы, по стандарту туда устанавливается первое
значение списка, т.е:

list.add("one");
list.add("two");


Когда я запущу свой пример то у меня в textView будет one. 

Вопрос: как сделать так что б при запуске программы у меня был textView.setText("")
 и только тогда когда я нажму на спиннер и выберу item то устанавливалось textView.setText(spinner.getSelectedItem().toString()); ?
    


Ответы

Ответ 1



То что вы описали - нормальное поведение дефолтного Spinner. Это многим не нравится, поэтому появилось альтернативное решение https://github.com/justjohn/transitwidget/blob/master/src/com/transitwidget/NoDefaultSpinner.java. Добавьте этот класс в свой проект и используйте вместо стандартного Spinner - NoDefaultSpinner. У вас не будет выбираться первое значение по умолчанию, а в самом Spinner будет устанавливаться текст из атрибута prompt.

Ответ 2



Есть более изящней способ вместо того что бы тянуть в проект левые исходники :-) Все что нужно это назначить OnItemSelectedListener в методе post() Выглядит это так: spinner.setAdapter(adapter); spinner.post(new Runnable() { @Override public void run() { spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { textView.setText(spinner.getSelectedItem().toString()); } @Override public void onNothingSelected(AdapterView parent) { textView.setText(""); } }); } });

пятница, 7 июня 2019 г.

Изменение кастомного макета для Spinner'a после его создания

Можно ли как-нибудь изменить кастомный макет для Spinner'a после его создания? Например, у меня есть Spinner, макет которого состоит из TextView и ImageView




наполнение его выглядит так:
Spinner spinner = findViewById(R.id.spinner_sorting); ArrayAdapter spinnerAdapter = new ArrayAdapter(this, R.layout.spinner_row, R.id.tv_sorting, getResources().getStringArray(R.array.sorting_array)); spinner.setAdapter(spinnerAdapter);
и в итоге Spinner выглядит следующим образом:

А мне хотелось бы изменить каждую вторую ImageView в этом Spinnere. Как это можно сделать?


Ответ

Создала кастомный адаптер для Spinner-a:
public class SortingSpinnerAdapter extends ArrayAdapter { private LayoutInflater inflater; private Context context; private String[] data;
public SortingSpinnerAdapter(@NonNull Context context, int resource, int textViewResourceId, String[] data) { super(context, resource, textViewResourceId, data); inflater = LayoutInflater.from(context); this.context = context; this.data = data; }
@Override public View getView(int position, View convertView, ViewGroup parent) { return createView(position, convertView, parent); }
@Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { return createView(position, convertView, parent); }
private View createView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.spinner_row, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.tv_sorting); holder.imageView = convertView.findViewById(R.id.iv_arrow); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } onBindViewHolder(holder, position); return convertView; }
private void onBindViewHolder(ViewHolder holder, int pos) { holder.textView.setText(data[pos]); if (pos % 2 == 0) { holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.arrow_downward)); } else { holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.arrow_upward)); } }
static class ViewHolder { TextView textView; ImageView imageView; } }
В итоге получила именно то, что хотела:

пятница, 12 апреля 2019 г.

Spinner не устанавливать значение пока не нажму(android)

У меня есть spinner:
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int childposition, long id) { textView.setText(spinner.getSelectedItem().toString()); }
@Override public void onNothingSelected(AdapterView parent) { textView.setText(""); } });
У меня есть textView При запуске программы, по стандарту туда устанавливается первое значение списка, т.е:
list.add("one"); list.add("two");
Когда я запущу свой пример то у меня в textView будет one.
Вопрос: как сделать так что б при запуске программы у меня был textView.setText("") и только тогда когда я нажму на спиннер и выберу item то устанавливалось textView.setText(spinner.getSelectedItem().toString()); ?


Ответ

То что вы описали - нормальное поведение дефолтного Spinner. Это многим не нравится, поэтому появилось альтернативное решение https://github.com/justjohn/transitwidget/blob/master/src/com/transitwidget/NoDefaultSpinner.java. Добавьте этот класс в свой проект и используйте вместо стандартного Spinner - NoDefaultSpinner. У вас не будет выбираться первое значение по умолчанию, а в самом Spinner будет устанавливаться текст из атрибута prompt.