簡體   English   中英

片段的自定義ListView只是在旋轉Android Phone時出現

[英]Custom ListView in Fragment just appear when I rotate the Android Phone

我創建了一個Fragment作為我應用程序的主要供稿。 列表數據(ArrayList)是通過Activity實現的片段中的內部接口從主活動加載的。

我的問題:

  1. 我的自定義ListView僅在旋轉電話時顯示。
  2. 旋轉時會兩次調用OnCreateView和OnActivityCreate。
  3. 如果在旋轉手機並單擊后顯示了ListView,則會收到下一個錯誤:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM