TabHost中的ListView滚动/单击问题

时间:2011-02-04 07:53:56

标签: android scroll android-listview android-tabhost

我最近出现了一个奇怪的问题。起初我在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”。它会加载新数据,但现在无法单击项目。当我滚动并做一个退缩时,屏幕上的触摸不会停止退缩。当我在退缩期间尝试滚动时,直到退缩停止时它没有任何效果。

如果切换到其他Tab,则会恢复列表视图行为。如果我尝试使用我的滚动球来聚焦项目,那么正常的行为也会回来。

<?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> 

修改

我确实尝试在load_database之后使invalid(),forceLayout(),requestLayout(),isFocusable()... bringToFront ......和其他人失效。但没有任何帮助。

EDIT2 几乎忘记了这段代码。

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

由于某些原因,TabHost存在问题。我的ListView由所有选项卡共享。首次加载视图时,它没有显示任何内容。所以我不得不从第二个标签切换到第一个标签。

1 个答案:

答案 0 :(得分:0)

所以我解决了我的问题,看看它是否在没有tabHost的情况下工作,我意识到它仍然无效。所以看看旧代码,我意识到我的延迟加载函数实际上是在下载完成后调用下载线程然后在uiThread上运行。

与上述代码的区别在于load_database不在另一个线程中运行。它是从getView函数运行的,它是我的适配器的一个功能。换句话说,它显然打破了listview以更新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运行。我的适配器更新列表视图没有问题。