Как отобразить выбранный элемент в Spinner? - PullRequest
0 голосов
/ 19 июня 2010

Я создал два Spinner для отображения данных в моем приложении.В моем первом Spinner первый элемент списка всегда отображается напрямую, но во втором Spinner ничего не отображается, даже если я щелкаю элемент в раскрывающемся списке.Кто-нибудь может объяснить это поведение?

Вот код инициализации двух счетчиков:

projects = new Spinner(lexs);
projectAdapter = new ProjectAdapter();
projects.setAdapter(projectAdapter);
projects.setMinimumWidth(250);
projects.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
   updateSpinners(position);                    
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
   // do nothing    
}

});

projectsList = new Spinner(lexs);
projectsList.setMinimumWidth(250);
listAdapter = new ListAdapter();
projectsList.setAdapter(listAdapter);
projectsListLayer.addView(projectsList);

Проекты Spinner - это первый Spinner, который работает правильно.projectsList - это второй Spinner, который работает неправильно.Вот две реализации адаптеров:

private class ProjectAdapter implements SpinnerAdapter {

        @Override
        public View getDropDownView(int position, View arg1, ViewGroup arg2) {
            TextView text = new TextView(lexs);
            text.setText(allProjects.get(position).getName());
            return text;
        }

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

        @Override
        public Object getItem(int position) {
            return allProjects.get(position);
        }

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

        @Override
        public int getItemViewType(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View arg1, ViewGroup arg2) {
            TextView text = new TextView(lexs);
            text.setText(allProjects.get(position).getName());
            return text;
        }

        @Override
        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public boolean hasStableIds() {
            return false;
        }

        @Override
        public boolean isEmpty() {
            if (allProjects.size() == 0) {
                return true;
            } else {
                return false;
            }
        }

        @Override
        public void registerDataSetObserver(DataSetObserver arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void unregisterDataSetObserver(DataSetObserver observer) {
            // TODO Auto-generated method stub

        }

    }

    private class ListAdapter implements SpinnerAdapter {

        @Override
        public View getDropDownView(int position, View view, ViewGroup parent) {
            TextView text = new TextView(lexs);
            text.setText(allLists.get(position).getName());
            return text;
        }

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

        @Override
        public Object getItem(int position) {
            return allLists.get(position);
        }

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

        @Override
        public int getItemViewType(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView text = new TextView(lexs);
            text.setText(allLists.get(position).getName());
            return text;
        }

        @Override
        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public boolean hasStableIds() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isEmpty() {
            if (allLists.size() == 0) {
                return true;
            } else {
                return false;
            }
        }

        @Override
        public void registerDataSetObserver(DataSetObserver observer) {
            // TODO Auto-generated method stub
        }

        @Override
        public void unregisterDataSetObserver(DataSetObserver observer) {
            // TODO Auto-generated method stub
        }

    }

Здесь я приложил картину проблемы:

http://www.freeimagehosting.net/image.php?7684c157b8.png

1 Ответ

1 голос
/ 19 июня 2010

Единственное, что я могу предложить, это добавить несколько операторов журнала и проверить, если allLists.size() > 0 до и после вашего updateSpinners вызова.

Кроме того, теперь, когда я думаю об этом.Вам также необходимо уведомить счетчик об изменении данных, позвонив по номеру BaseAdapter#notifyDataSetChanged.В противном случае он не будет знать, что у него есть новые данные для отображения.Таким образом, вы должны расширить BaseAdapter и реализовать SpinnerAdapter.BaseAdapter будет обрабатывать реализацию registerDataSetObserver и unregisterDataSetObserver.Вам, вероятно, также понадобится ваш updateSpinners звонок в notifyDataSetChanged. *1013*.

Проверьте источник ArrayAdapter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...