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();
}
}
나는 어떻게하는지 모르지만 이것은 나에게도 효과가있다. –