0

TabHct의 FrameLayout 안에 하나의 ListView에 대해 TabActivity가 있습니다. 이 ListView는 3 개의 탭에서 공유됩니다. 목록의 항목은 처리기를 사용하여 인터넷에서 다운로드되지만 데이터가 올 때 목록이 업데이트되지 않습니다. 다른 탭을 선택하면 목록이 자동으로 업데이트되지만 다운로드 후 업데이트되는 것을 볼 수 있기를 원합니다. 이미 ListView, FrameLayout 및 TabHost를 무효화하려고했지만 아무 일도 발생하지 않습니다. notifyDataSetChanged() 및 notifyDataSetInvalidated() 메소드도 도움이되지 않습니다. ListView를 FrameLayout 밖으로 배치하면 예상대로 작동합니다. 여기 코드는 다음과 같습니다TabHost의 FrameLayout 안에있는 ListView를 업데이트 할 수 없습니다.

<?xml version="1.0" encoding="UTF-8"?> 

<TabHost android:id="@android:id/tabhost" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_alignParentTop="true"> 

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

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

    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <ListView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/comments_list_lv" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 
     </FrameLayout> 
</LinearLayout> 

public class CommentsActivity extends TabActivity implements Handler.Callback, OnTabChangeListener { 

private static final int take = 20; 
private Handler handler; 
private CommentsListModel model = null; 
private ListView listView; 
private CommentsListAdapter adapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.comments_activity); 

    handler = new Handler(this); 

    setContentView(R.layout.comments_activity); 
    listView = (ListView) findViewById(R.id.comments_list_lv); 
    listView.setTextFilterEnabled(true); 
    getTabHost().setOnTabChangedListener(this); 

    buildTabs(); 
    setListView(); 
    requestData(); 
} 


@Override 
public boolean handleMessage(Message msg) { 
    AbstractResponse response = (AbstractResponse) msg.obj; 
    ResponseStatus status = response.getStatus(); 

    if (status.getResponseCode() == ResponseStatus.OK) { 
     model = (CommentsListModel) response.getResponseObject(); 
     adapter = new CommentsListAdapter(this, model.getComments()); 
     listView.setAdapter(adapter); 
    } 
    return true; 
} 


@Override 
public synchronized void onTabChanged(String tabName) { 
    if (model != null) { 
     Resources res = getResources(); 
     CommentsFilter filter = null; 
     if (tabName.equals(res.getString(R.string.comments_all))) { 
      filter = new CommentsFilter(model.getComments(), CommentsFilter.ALL); 
     } else if (tabName.equals(res.getString(R.string.comments_liked))) { 
      filter = new CommentsFilter(model.getComments(), CommentsFilter.LIKED); 
     } else if (tabName.equals(res.getString(R.string.comments_disliked))) { 
      filter = new CommentsFilter(model.getComments(), CommentsFilter.DISLIKED); 
     } 
     adapter = new CommentsListAdapter(this, filter.filter()); 
     listView.setAdapter(adapter); 
    } 
} 


private void buildTabs() { 
    Resources res = getResources(); 

    TabHost tabHost = getTabHost(); 
    String tabName = res.getString(R.string.comments_all); 

    TabHost.TabSpec spec = tabHost.newTabSpec(tabName); 
    spec.setIndicator(tabName, null); 
    spec.setContent(R.id.comments_list_lv); 
    tabHost.addTab(spec); 

    tabName = res.getString(R.string.comments_liked); 

    spec = tabHost.newTabSpec(tabName); 
    spec.setIndicator(tabName, null); 
    spec.setContent(R.id.comments_list_lv); 
    tabHost.addTab(spec); 

    tabName = res.getString(R.string.comments_disliked); 

    spec = tabHost.newTabSpec(tabName); 
    spec.setIndicator(tabName, null); 
    spec.setContent(R.id.comments_list_lv); 
    tabHost.addTab(spec); 
    } 


private void requestData() { 
    AbstractRequest request = new CommentsRequest(barcode, 0, take); 
    request.addListener(handler); 

    Message msg = new Message(); 
    msg.what = ApplicationActions.ProtocolActions.REQUEST; 
    msg.obj = request; 
    msg.setTarget(AsyncRequestController.getInstance().getInboxHandler()); 
    msg.sendToTarget(); 
} 
                             } 

답변

3

나는이 문제를 해결했다. 어댑터를 설정 한 후에는 listView.setVisibility (View.VISIBLE) 만 설정하면됩니다. 보기가 보이지 않거나 XML 파일로 이동하지는 않았지만이 경우에는 표시 여부를 설정해야합니다.

+0

나는 어떻게하는지 모르지만 이것은 나에게도 효과가있다. –

관련 문제