2011-02-04 6 views
0

최근에 나타난 이상한 문제가 있습니다. 처음에는 ListView에 모든 항목을로드하고있었습니다. 그것은 모두 잘 스크롤하고있었습니다. 항목을 클릭 할 수 있었고 모두 잘 작동했습니다. 여기ListView에서 TabHost 스크롤/클릭 문제가 발생했습니다.

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

과이 문제를 잘 그 후 나타난

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은()이다 :

그런 다음 내 어댑터의 getView에서 나는 덧붙였다. 로드 할 때 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() ... bringToFront ... 등 load_database 후. 그러나 아무것도 도움이되지 않았습니다.

편집 2 코드 조각을 거의 잊어 버렸습니다.

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

몇 가지 이유로 TabHost에 문제가 있습니다. 내 ListView는 모든 탭에서 공유됩니다. 뷰를 처음로드 할 때 아무것도 표시되지 않았습니다. 그래서 두 번째 탭에서 첫 번째 탭으로 전환해야했습니다.

답변

0

그래서 문제가 해결되었는데 tabHost없이 제대로 작동하는지 확인한 후에도 여전히 문제가 해결되었다. 이전 코드를 살펴보면, 게으른로드 기능이 실제로 백그라운드에서 실행 된 다운로드 스레드를 호출 한 다음 다운로드가 완료된 후 uiThread에 다시 돌아 갔음을 알았습니다.

위의 코드와 다른 점은 load_database가 다른 스레드에서 실행되지 않는다는 것입니다. 내 어댑터의 기능인 getView 함수에서 실행됩니다. 즉, getView에서 어댑터를 업데이트하기 위해 listview를 깨뜨린 것 같습니다.

내 현재 수정 프로그램이 최선이 아니지만 지금은 그 일을합니다. 미래.

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에서 runned되지 않습니다. 그리고 내 어댑터 문제없이 listview를 업데이 트하십시오.

관련 문제