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

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

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

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

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>

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

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

Изменить: Снимок экрана

Screenshot of spinner

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Adapter:

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

Ответ 3

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

Я извлек то, что я делал в 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;
    }
}

Ответ 4

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

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

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