Установить текст выбранного элемента счетчика

У меня есть счетчик (только соответствующие части кода) ...

protected void onCreate(Bundle savedInstanceState) {

   Spinner to_spinner = (Spinner) findViewById(R.id.to_spinner);
   List<Unit> list = myDbHelper.getAllUnits();
   SpinnerUnitAdapter tUnitAdapter tUnitAdapter = new SpinnerUnitAdapter(this, android.R.layout.simple_spinner_item, list);

   to_spinner.setAdapter(tUnitAdapter);
   to_spinner.setOnItemSelectedListener(onItemSelectedListenerTo);
}

с onItemSelectedListener

AdapterView.OnItemSelectedListener onItemSelectedListenerTo = new     AdapterView.OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view,
                               int position, long id) {

        // do stuff
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapter) {
    }
};

Когда элемент выбран (то есть там, где написано: «делать что-нибудь»), я хотел бы установить / изменить текст выбранного элемента счетчика. (Обратите внимание, что это не то же самое, что и установка положения счетчика (с помощью setSelection ()).

Я думал сделать это с

tUnitAdapter.getView(position, ?, ?).setText("new text");

Я на правильном пути? Что ставить в качестве второго ("convertView") и третьего ("родительского") аргумента в getView. Мой адаптер спиннера выглядит так:

public class SpinnerUnitAdapter extends ArrayAdapter<Unit> {
     ...
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
         TextView label = new TextView(mContext);
         label.setTextColor(Color.BLACK);                        
       label.setTextSize(mContext.getResources().getDimension(R.dimen.list_row_font_size));
         label.setGravity(Gravity.CENTER);
         label.setText(getItem(position).getName());

         return label;
    }
}

person user1583209    schedule 12.11.2015    source источник


Ответы (3)


Я на правильном пути?

Нет. Вам необходимо выполнить следующие действия: (в методе onItemSelected)

  • Обновите свою модель (массив элементов, которые вы передали адаптеру), чтобы элемент с индексом position получил новое имя.

  • Ошибка notifyDataSetChanged на объекте адаптера. Кроме того, вы можете сделать это вручную с помощью ((TextView) view).setText(new_name);

Примечание. В onItemSelected методе adapterView указывает на ваше представление счетчика, а view указывает на только что выбранное представление строки.


ОБНОВЛЕНИЕ №1

public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
    ((TextView) view).setText("new name");
}

ОБНОВЛЕНИЕ №2

Для этого вы должны использовать интерфейс Java для реализации обратного вызова, который вызывается после закрытия диалогового окна.

public void onItemSelected(AdapterView<?> adapterView, final View view, int position, long id) {
    Dialog dialog = new MyDialog(context, new MyDialog.OnItemSelectListener(){
        @Override
        public void onItemSelected(String newName){
            ((TextView) view).setText(newName);
        }
    });
    dialog.show();
}

И объявите интерфейс OnItemSelectListener в своем MyDialog классе.

person frogatto    schedule 12.11.2015
comment
Спасибо за ответ. Я действительно не хочу менять базовые данные, поскольку они другого типа. Из пользовательского опыта я пытаюсь реализовать спиннер с подменю / диалоговым окном, то есть пользователь выбирает элемент счетчика (скажем, автомобиль), который открывает диалог с множественным выбором (скажем, Mercedes, Porsche ...). После того, как пользователь выберет элемент в диалоговом окне / подменю (например, VW), диалоговое окно / подменю закроется, а в счетчике появится надпись VW (не автомобиль). - person user1583209; 12.11.2015
comment
@ user1583209 Хорошо. это просто. Просто посмотрите мою правку. - person frogatto; 12.11.2015
comment
Это даже проще, чем мое решение ниже. Спасибо. Теперь мне просто нужно как-то переместить этот setText в мой диалог, чтобы он выполнялся только после выбора элемента диалога. Должен ли я как-нибудь передать вид (как?)? - person user1583209; 12.11.2015

Вы можете изменить текст счетчика, когда вы щелкаете каждый элемент, поэтому вы должны реализовать onClickListener

public class SpinnerUnitAdapter extends ArrayAdapter<Unit> {
         ...
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             TextView label = new TextView(mContext);
             ...
             label.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  // change label text here
                  // label.setText(...);
                }
             });
             return label;
        }
    }

Надеюсь на эту помощь

person Linh    schedule 12.11.2015

Думаю, я нашел решение. Я просто могу:

public void onItemSelected(AdapterView<?> adapterView, View view,
                               int position, long id) {
    TextView tv = (TextView) adapterView.getSelectedView();
    tv.setText("new text");
}
person user1583209    schedule 12.11.2015