it-swarm.com.ru

Пример пользовательского элемента счетчика setDropDownViewResource

Я хотел бы отобразить два значения в раскрывающемся списке моего счетчика.

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

    MyCity<MyCityDistance> dataAdapter;  

    dataAdapter = new MyCity(this, R.layout.mycityrow, list);
    dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

У меня есть весь код для пользовательского адаптера данных, за исключением моего представления и держателя и т.д.

Тем не менее, предмет, который выставлен на показ, не отображает ни город, ни расстояние от моего текущего местоположения.

Он показывает только то, что переопределяется в методе toString () класса MyCityDistance.

Я даже пытался установить

dataAdapter.setDropDownViewResource(R.layout.mycityrow);

но безуспешно. Выдает ошибку.

04-02 11:05:22.600: E/AndroidRuntime(367): Java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
04-02 11:05:22.600: E/AndroidRuntime(367):  at Android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.Java:347)
04-02 11:05:22.600: E/AndroidRuntime(367):  at Android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.Java:376)
04-02 11:05:22.600: E/AndroidRuntime(367):  at Android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.Java:332)

Что является хорошим примером создания вашей собственной setDropDownViewResource()?

Даже если я закомментирую строку setDropDownViewResource(), я получаю ту же ошибку.

Примечание. Единственный текущий эффект mycityrow заключается в том, что первый элемент Spinner отображается в соответствии с макетом mycityrow. Тем не менее, когда я нажимаю открыть раскрывающийся список, этот макет теряется. Я хочу, чтобы тот же макет во время выпадающего выбора тоже.

11
Kapil D

Обратите внимание, что в приведенном ниже примере используется встроенный Android.R.layout.simple_list_item_2. К сожалению, цвет текста, вероятно, будет таким же, как фон. Вы можете просто решить эту проблему, создав собственный пользовательский вид и использовать его вместо адаптера.

Дайте мне знать, если я должен объяснить какую-либо часть этого.

public class MainActivity extends Activity {

    class City {
        public City(String city, int d) {
            this.city = city;
            this.distance = String.valueOf(d);
        }

        String city;
        String distance;
    }

    class CityAdapter extends ArrayAdapter<City> {

        public CityAdapter(Context context, List<City> objects) {
            super(context, Android.R.layout.simple_list_item_2, objects);
        }

        @Override //don't override if you don't want the default spinner to be a two line view
        public View getView(int position, View convertView, ViewGroup parent) {
            return initView(position, convertView);
        }

        @Override
        public View getDropDownView(int position, View convertView,
                                    ViewGroup parent) {
            return initView(position, convertView);
        }

        private View initView(int position, View convertView) {
            if(convertView == null)
                convertView = View.inflate(getContext(),
                                           Android.R.layout.simple_list_item_2,
                                           null);
            TextView tvText1 = (TextView)convertView.findViewById(Android.R.id.text1);
            TextView tvText2 = (TextView)convertView.findViewById(Android.R.id.text2);
            tvText1.setText(getItem(position).city);
            tvText2.setText(getItem(position).distance);
            return convertView;
        }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Spinner spinner = (Spinner)findViewById(R.id.spinner1);
        List<City> list = new ArrayList<MainActivity.City>();
        for(int i = 0; i < 10; i++)
            list.add(new City(String.format("City %d", i + 1), (i + 1) * 1000));
        spinner.setAdapter(new CityAdapter(this, list));

    }

}
20
st0le

Попробуйте прокомментировать строку dataAdapter.setDropDownViewResource (), и адаптер попытается использовать файл макета mycityow для раскрывающегося списка. Работает в простых случаях.

1
Akhil