ListView в TabHost проблемы с прокруткой / щелчком - PullRequest
0 голосов
/ 04 февраля 2011

У меня странная проблема, которая недавно появилась. Сначала я загружал все элементы в моем ListView. Прокручивалось все нормально. Элементы были кликабельны, и все работало нормально.

Затем в getView моего адаптера я добавил, что:

if(pos == getCount() - 1){
    Log.i("Load", "Load database");
    load_database(getCount(), 5);
}

а вот load_database ()

private void load_database(long offset, long count) {
    ArrayList<VKContent> objs = BaseApplication.db.get_all(Message.class, MessageHandler.COLUMN_MAILBOX + " = " + mailbox, count, offset);
    for(VKContent obj: objs){
        adp.add((Message)obj);
    }
}

Проблема появилась сразу после этого. При загрузке он вызывает load_database один раз, и все хорошо. ListView работает нормально. Клики обрабатываются. Но как только я достигаю "pos == getCount () - 1". Он загружает новые данные, но теперь невозможно щелкнуть элементы. Когда я прокручиваю и делаю вздрагивание, прикосновение к экрану не останавливает вздрагивание. Когда я пытаюсь прокрутить во время вздрагивания, это не имеет никакого эффекта, пока вздрагивание не прекратилось.

Если я переключаюсь на другую вкладку, поведение просмотра списка восстанавливается. Если я попытаюсь использовать шарик прокрутки, чтобы сфокусировать предметы, вернется и нормальное поведение.

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@android:id/tabhost"> 

     <LinearLayout 
  android:orientation="vertical"
  android:layout_height="match_parent"
  android:layout_width="match_parent">

         <TabWidget android:id="@android:id/tabs"
             android:layout_height="wrap_content"
             android:layout_width="fill_parent" />

         <FrameLayout android:id="@android:id/tabcontent"
             android:layout_height="fill_parent"
             android:layout_width="fill_parent"
             android:layout_weight="1">
            <LinearLayout android:id="@+id/tab2"
                android:orientation="vertical"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent">
                <ListView android:id="@+id/lv"
                    android:layout_height="fill_parent"
                    android:layout_width="fill_parent"
                    android:clickable="true" />
            </LinearLayout>
         </FrameLayout> 
     </LinearLayout>
</TabHost> 

Редактировать

Я пытался сделать недействительными (), forceLayout (), requestLayout (), isFocusable () ... takeToFront ... и другие после load_database. Но ничего не помогло.

Edit2 Почти забыл этот кусок кода.

    tabHost.setCurrentTab(1);
    tabHost.setCurrentTab(0);

По некоторым причинам существует проблема с TabHost. Мой ListView доступен для всех вкладок. Когда представление загружается впервые, оно ничего не отображает. Поэтому мне пришлось переключиться со второй на первую вкладку.

1 Ответ

0 голосов
/ 07 февраля 2011

Итак, я исправил свою проблему, посмотрев, работает ли она без вкладки Хост, я понял, что она все еще не работает. Глядя на старый код, я понял, что моя функция отложенной загрузки на самом деле вызывает поток загрузки, который запускается в фоновом режиме, а затем возвращается в uiThread после завершения загрузки.

Разница с приведенным выше кодом заключается в том, что load_database не запускается в другом потоке. Он запускается из функции getView, которая является функцией моего адаптера. Другими словами, он явно нарушает просмотр списка, чтобы обновить адаптер в getView.

моё текущее исправление не самое лучшее, но пока оно работает. В будущем.

if(pos == getCount() - 1){
    MessagesActivity.this.load_more = true;
}

и

@Override
public void onUserInteraction() {
    super.onUserInteraction();

    if(load_more == true || adp.getCount() == 0){
        load_more = false;
        load_database(adp.getCount(), 5);
    }
}

таким образом, база данных load_database никогда не запускается из getView. И мой адаптер обновляет список без проблем.

...