Экран Android, показывающий ссылку на объект вместо строки

Хорошо, поэтому у меня проблема с моим счетчиком. Его заполняют данные, извлеченные из веб-службы. Проблема im заключается в том, что, когда счетчик не щелкнут, а не показывает строку для первого элемента в счетчике, вместо этого он указывает ссылку на объект для него.

Я посмотрел на связанный с ним вопрос, но все еще не мог понять, что им не хватает, так же просто, как пропустить ссылку toString?

Вот код для заполнения счетчика

private void buildDrinkDropDown() { List<NameValuePair> apiParams = new ArrayList<NameValuePair>(1); apiParams.add(new BasicNameValuePair("call", "drinkList")); bgt = new BackGroundTask(MAP_API_URL, "GET", apiParams); try { JSONArray drinks = bgt.execute().get(); for (int i = 0; i < drinks.length(); i++) { JSONObject d = drinks.getJSONObject(i); String id = d.getString(TAG_ID_DRINK); String createdAt = d.getString(TAG_CREATED_AT); String updatedAt = d.getString(TAG_UPDATED_AT); String price = d.getString(TAG_PRICE); String name = d.getString(TAG_NAME); drinkList.add(new Drink( createdAt ,id, name, price,updatedAt )); } drinkField = (Spinner) findViewById(R.id.countryField); DrinkAdapter dAdapter = new DrinkAdapter(this, android.R.layout.simple_spinner_item, drinkList); drinkField.setAdapter(dAdapter); drinkField.setOnItemSelectedListener(new OnItemSelectedListener(){ @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { //Drink selectedDrink = drinkList.get(position); GlobalDrinkSelected = drinkList.get(position).getId().toString(); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } catch (JSONException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } 

Вот код для класса адаптера

 package com.android.main; import java.util.ArrayList; import android.app.Activity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class DrinkAdapter extends ArrayAdapter<Drink> { private Activity context; ArrayList<Drink> data = null; public DrinkAdapter(Activity context, int resource, ArrayList<Drink> data) { super(context, resource, data); this.context = context; this.data = data; } @Override public View getView(int position, View convertView, ViewGroup parent) { // Ordinary view in Spinner, we use android.R.layout.simple_spinner_item return super.getView(position, convertView, parent); } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { // This view starts when we click the spinner. View row = convertView; if(row == null) { LayoutInflater inflater = context.getLayoutInflater(); row = inflater.inflate(R.layout.dropdown_value_id, parent, false); } Drink item = data.get(position); String test = item.getName(); Log.d("test ", test); if(item != null) { TextView drinkName = (TextView) row.findViewById(R.id.item_value); if(drinkName != null){ drinkName.setText(item.getName()); Log.d("find me ", drinkName.toString()); } } return row; } } 

Вот xml для макета dropdown_value_id, который используется в адаптере

 <?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="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/item_value" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> 

Если вам нужна дополнительная информация, просто кричите.

Любая помощь была бы значительно расширена

Редактировать: Скриншот

Снимок экрана

Solutions Collecting From Web of "Экран Android, показывающий ссылку на объект вместо строки"

Моя быстрая мысль: метод getView () используется для представления строки. Можете ли вы реализовать аналогичное кодирование, например метод getDropDownView, в метод getView ().

Скопировать содержимое из метода getDropDownView в метод getView ()

Я не пробовал это, но я сделал аналогичный в ListView, где я сделал аналогичную кодировку в методе getView ().

Я также попытаюсь воспроизвести это локально и опубликовать, если найду что-нибудь.

У меня была аналогичная проблема, однако я использовал ArrayAdapter по умолчанию, не расширив его в отдельном классе. Изучив немного, я нашел следующее:

Однако ссылка TextView ссылается, она будет заполнена toString () каждого объекта в массиве. Вы можете добавлять списки или массивы пользовательских объектов. Переопределите метод toString () ваших объектов, чтобы определить, какой текст будет отображаться для элемента в списке.

ArrayAdapter по умолчанию вызовет .toString () для каждого объекта в массиве, который был передан адаптеру. Если ваш DrinkAdapter делает не что иное, как отображать имя напитка, вы можете переопределить метод toString () и завершить его

адаптер:

 ArrayAdapter<Drink> drinkAdapter = new ArrayAdapter<Drink>(getActivity(), android.R.layout.simple_spinner_dropdown_item, drinks); 

Объект класса:

 public Drink { String name; // Constructor, getters, and setters for the object here @Override public String toString() { return getName(); // You can add anything else like maybe getDrinkType() } } 

И все готово, нет необходимости создавать отдельный класс для вашего DrinkAdapter

Хорошо, поэтому я решил это, сделав немного больше исследований и посмотрев на ответ на этот вопрос. Пример настраиваемого элемента setDropDownViewResource spinner item

Я извлек то, что делал в getDropDownView, и вызвал его как в getView, так и в getDropDownView.

Вот код

 package com.android.main; import java.util.ArrayList; import android.app.Activity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class DrinkAdapter extends ArrayAdapter<Drink> { private Activity context; ArrayList<Drink> data = null; public DrinkAdapter(Activity context, int resource, ArrayList<Drink> data) { super(context, resource, data); this.context = context; this.data = data; } @Override public View getView(int position, View convertView, ViewGroup parent) { // Ordinary view in Spinner, we use android.R.layout.simple_spinner_item return initView(position, convertView, parent); } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { // This view starts when we click the spinner. return initView(position, convertView, parent); } private View initView(int position, View convertView, ViewGroup parent) { View row = convertView; if(row == null) { LayoutInflater inflater = context.getLayoutInflater(); row = inflater.inflate(R.layout.dropdown_value_id, parent, false); } Drink item = data.get(position); String test = item.getName(); Log.d("test ", test); if(item != null) { TextView drinkName = (TextView) row.findViewById(R.id.item_value); if(drinkName != null){ drinkName.setText(item.getName()); Log.d("find me ", drinkName.toString()); } } return row; } } 

В вашем классе определите Object для отображения в ListView, вы добавляете пример строки кода ниже

 @Override public String toString() { return getComment(); } 

Это слово для меня.