[英]Custom ListView in Fragment just appear when I rotate the Android Phone
我創建了一個Fragment作為我應用程序的主要供稿。 列表數據(ArrayList)是通過Activity實現的片段中的內部接口從主活動加載的。
我的問題:
java.lang.IllegalStateException:適配器的內容已更改,但ListView沒有收到通知。 確保不從后台線程修改適配器的內容,而僅從UI線程修改。 確保適配器在其內容更改時調用notifyDataSetChanged()。 [在ListView(2131034209,類android.widget.ListView)和Adapter(類com.fb.newcomersapp.CustomListAdapter)中]
那是我的主要片段方法:
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
listView = (ListView) getView().findViewById(R.id.event_list_view);
mCallback.parseQueryEvents();
ArrayList<Event> eventList = mCallback.getEventList();
Log.d("FeedActivity", eventList.size()+"");
CustomListAdapter adapter = new CustomListAdapter(getActivity(), eventList);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
mCallback.openEvent(position);
}
});
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_feed, container, false);
textView = (TextView) view.findViewById(R.id.tv_header);
textView.setText(mCallback.getLocal());
return view;
}
主要活動方法:
public void parseQueryEvents () {
eventList = new ArrayList<Event>();
ParseQuery<ParseObject> query = ParseQuery.getQuery("Event");
query.orderByAscending("startDate") ;
query.whereGreaterThanOrEqualTo("endDate", new Date()) ;
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> parseEventList, ParseException e) {
if (e == null) {
ParseObject temp ;
Iterator<ParseObject> i = parseEventList.iterator() ;
while(i.hasNext()) {
temp = i.next();
eventList.add(new Event(temp)) ;
}
} else {
Log.d("FeedActivity", e.getMessage());
}
}
});
}
public ArrayList<Event> getEventList() {
// TODO Auto-generated method stub
return eventList;
}
日志:
02-04 13:36:06.844:D / GPS(7237):GPS 02-04 13:36:07.110:D / FeedActivity(7237):0 02-04 13:36:07.145:D / GPS(7237): GPS 02-04 13:36:07.409:D / FeedActivity(7237):0 02-04 13:36:07.420:I / Choreographer(7237):跳過39幀! 該應用程序可能在其主線程上做太多工作。 02-04 13:36:07.451:W / View(7237):android.widget.ListView {42079068 IFED.VC不正確地調用了requestLayout()。 ......在布局過程中ID -360,0-0,778#7f050041 app:id / list_slidermenu}:運行第二個布局遍
那么,有人可以幫助我嗎? x
前一段時間,我在處理方向變化時遇到了這個問題。 抱歉,沒有提供完整的答案atm,但基本上將適配器(如果需要,還可以將ListView)保存為類變量。 然后,在onActivityCreated內部,將有關創建和設置適配器的行放在if語句中,以檢查適配器是否為null。 所以像這樣
private CustomListAdapter mAdapter; // Add this variable
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
listView = (ListView) getView().findViewById(R.id.event_list_view);
mCallback.parseQueryEvents();
ArrayList<Event> eventList = mCallback.getEventList();
Log.d("FeedActivity", eventList.size()+"");
// Add this conditional
if(mAdapter == null) {
CustomListAdapter adapter = new CustomListAdapter(getActivity(), eventList);
listView.setAdapter(adapter);
}
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
mCallback.openEvent(position);
}
}
}
我相信問題出在某個地方,它在重新創建Activity + Fragment時試圖通過緩存變量(例如具有ID的視圖(例如ListView)來緩存),從而節省了我們所有的時間,但是,在所有這些設置中,適配器導致問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.