Почему не отображается моя первая вкладка?

#android #tabs

#Android #вкладки

Вопрос:

Я создал действие вкладки, показывающее количество вкладок, определенных в массиве строк xml. Каждая вкладка имеет тот же listview, что и содержимое, которое я обновляю разными данными. Я вижу свои вкладки и содержимое, обновляемые каждый раз, когда я нажимаю на вкладку, но первая вкладка (при создании действия) никогда не отображается.

Я вижу в своих журналах, что onTabChanged вызывается при выполнении onCreate, но результат не отображается. Если я изменю выбранную вкладку и вернусь к первой, я смогу ее увидеть.

Это мой код :

 public class MyActivity extends TabActivity {
    protected final void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LOGGER.debug("onCreate.start");

        setContentView(R.layout.mylayout);

        listview = (ListView) findViewById(R.id.listview);
        adapter = new MyAdapter(getApplicationContext(), new ArrayList<Station>());
        listview.setAdapter(adapter);

        final Resources res = getResources();
        final TabHost tabHost = getTabHost();

        tabHost.setOnTabChangedListener(new OnTabChangeListener(
            (MyApplication) getApplicationContext()));

        TabHost.TabSpec spec;

        final String[] tabsString = res.getStringArray(R.array.tabs);
        for (int i = 0; i < tabsString.length; i  ) {
            final String[] tab = tabsString[i].split("\|");
            spec = tabHost.newTabSpec(tab[0]).setIndicator(tab[1]);
            spec.setContent(R.id.tabcontent);

            tabHost.addTab(spec);

            tabHost.getTabWidget().getChildAt(i).getLayoutParams().width = TAB_WIDTH;
        }

        LOGGER.debug("onCreate.end");
    }


    public void onTabChanged(final String tabId) {

        LOGGER.debug("onTabChanged.start");

        refreshTask = new AsyncTask<Void, Void, List<Station>>() {

            @Override
            protected void onPreExecute() {

                /* Show progress bar and hide list view. */
                findViewById(R.id.loading).setVisibility(View.VISIBLE);
                findViewById(R.id.listview).setVisibility(View.GONE);
            };

            @Override
            protected List<Station> doInBackground(final Void... params) {

                return getStations(0, 0, tabId);
            }

            @Override
            protected void onPostExecute(final List<Station> result) {

                if (result != null) {
                    adapter.setStations(result);
                } else {
                    adapter.clear();
                }
                adapter.notifyDataSetChanged();

                /* Hide progress bar and show list view. */
                findViewById(R.id.loading).setVisibility(View.GONE);
                findViewById(R.id.listview).setVisibility(View.VISIBLE);
            }
        };

        refreshTask.execute();

        LOGGER.debug("onTabChanged.end");
    }
}
  

И это журнал, который я вижу в консоли LogCat :

 MyActivity        onCreate.start
MyActivity        onTabChanged.start
MyActivity        onTabChanged.end
MyActivity        onCreate.end
  

У вас есть идея?
Спасибо

Ответ №1:

Следующая строка кода вызывает проблему adapter = new MyAdapter(getApplicationContext(), new ArrayList()); вы передаете arralist с размером 0, следовательно, данные не отображаются. Но когда вкладка меняется, тогда в вашем слушателе вы передаете arralist, который содержит некоторые данные, и, следовательно, вы можете увидеть данные, когда вернетесь. Наслаждайтесь..

Комментарии:

1. Хороший улов. Кроме того, вы не должны использовать контекст приложения прямо там. Используйте контекст действия, назначив «это».

2. Да, я инициализирую свой адаптер без данных. Когда onTabChanged вызывается onCreate() (потому что по умолчанию отображается первая вкладка), я обновляю этот адаптер данными, но этого недостаточно, и содержимое моей вкладки всегда пустое. Я должен выбрать вторую вкладку и вернуться к первой, чтобы увидеть что-то в первой.

Ответ №2:

Попробуйте установить первую вкладку как активную в конце вашего onCreate после создания всех вкладок:

 tabHost.setCurrentTab(0);
  

Комментарии:

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