Я могу заполнить свой счетчик списком массивов из API. Но невозможно выбрать или заполнить выбранный элемент из счетчика и отобразить его пользователю.

Метод onItemSelected не получает позицию выбранного элемента в счетчике.

< Сильный > CustomSpinnerAdapter.java

public class CustomSpinnerAdapter extends BaseAdapter {
Context context;
List<String> userNames;
LayoutInflater inflter;

public CustomSpinnerAdapter(Context applicationContext, List<String> userNames) {
    this.context = applicationContext;
    this.userNames = userNames;
    inflter = (LayoutInflater.from(applicationContext));
}

@Override
public int getCount() {
    return userNames.size();
}

@Override
public Object getItem(int i) {
    return userNames.get(i);
}

@Override
public long getItemId(int i) {
    return 0;
}

@NonNull
@SuppressLint({"ViewHolder", "InflateParams"})
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    view = inflter.inflate(R.layout.custom_spinner_item, null);
    CustomTextView names = (CustomTextView) view.findViewById(R.id.tv_spinner_item);
    names.setText(userNames.get(i));
    return view;
   }
}

Моя логика во фрагменте.

private SpinnerAdapter customAdapter;
private List<String> eqIds = new ArrayList<>;

 apiInterface = ApiRequest.createService(ApiInterface.class);
    Call<EquipmentTypeModel> call = apiInterface.getEquipmentType("application/json", token, id);

    call.enqueue(new Callback<EquipmentTypeModel>() {
        @Override
        public void onResponse(Call<EquipmentTypeModel> call, Response<EquipmentTypeModel> response) {
            if (response.isSuccessful()) {
                eqIds.addAll(response.body().getData().getEquipmentList().getEquipIds());
            }
        }

        @Override
        public void onFailure(Call<EquipmentTypeModel> call, Throwable t) {

        }
    });
    customAdapter = new CustomSpinnerAdapter(mContext, eqIds);
    spTypeModel.setAdapter(customAdapter);
    spTypeModel.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(mContext, String.valueOf(parent.getAdapter().getItem(position)), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });
1
Rakshit Sorathiya 14 Сен 2018 в 17:02

2 ответа

Лучший ответ

Чтобы получить выбранное значение из счетчика, вы должны

String selectedValue = spTypeModel.getSelectedItem().toString();

Или

String selectedValue = String.valueOf(parent.getAdapter().getItem(position));

Вместо

String selectedValue = String.valueOf(position);

Обновление: измените метод getItem в пользовательском адаптере на

@Override
public Object getItem(int i) {
    return userNames.get(i);
}

Обновление 2: я заметил вашу проблему. Измените код.

private SpinnerAdapter customAdapter;

Кому

private CustomSpinnerAdapter customAdapter;

Затем добавьте эту строку после добавления новых данных в адаптер.

eqIds.addAll(response.body().getData().getEquipmentList().getEquipIds());
customAdapter.notifyDataSetChanged(); // Add this line to notify your adapter about new data

Обновление 3: из вашего XML-файла, поскольку высота счетчика составляет 18 dp.

  • В spinner вы устанавливаете отступ на 4dp (будет 8dp для вершины и бота)
  • В пользовательском текстовом представлении вы также установите отступы 4dp (будет 8dp для верха и бота)
  • Таким образом, у вас есть только 2dp или меньше для отображения текстового контента, он очень маленький, поэтому вы не можете видеть контент.

Вы можете установить высоту счетчика на wrap_content или оставить текущую высоту, но удалить отступы из счетчика или из пользовательского текстового представления. Тебе решать.

1
Son Truong 15 Сен 2018 в 05:41

Попробуйте, если это сработает (он покажет вам значение, а не позицию)

  @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(mContext, parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
    }
0
JoaquinAlvarez 14 Сен 2018 в 14:14