2011-02-04 71 views
0

我有一個最近出現的奇怪問題。起初我在我的ListView中加載所有項目。它滾動一切都很好。項目是可點擊的,並且一切正常。ListView in TabHost滾動/點擊問題

然後在我的適配器的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」。它加載新的數據,但現在無法點擊項目。當我滾動並退縮時,屏幕上的觸摸不會停止退縮。當我在退縮時嘗試滾動時,它在退出停止之前沒有任何效果。

如果我切換到不同的Tab,則listview行爲被恢復。如果我嘗試用我的滾動球來聚焦物品,那麼正常的行爲也會回來。

<?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()... ... bringToFront和load_database後等。但沒有任何幫助。

編輯2 幾乎忘了那段代碼。

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

由於某些原因,TabHost存在問題。我的ListView由所有選項卡共享。第一次加載視圖時,它不顯示任何內容。所以我不得不從第二個標籤切換到第一個標籤。

回答

0

所以我解決了我的問題,看看它是否沒有tabHost工作,我意識到它仍然無法正常工作。所以看着舊代碼,我意識到我的懶加載函數實際上是調用一個下載線程,它在後臺運行,然後在下載完成後返回到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拼命地跑。和我的適配器更新列表視圖沒有問題。