0

내 앱의 기본 피드로 조각을 만들었습니다. 목록 데이터 (ArrayList)는 기본 활동에서 Activity가 구현하는 조각의 내부 인터페이스를 통해로드됩니다.안드로이드 전화를 돌릴 때 단편의 맞춤 목록보기가 나타납니다

내 문제 :

  1. 나는 드 전화를 회전 할 때 바로 표시됩니다 내 사용자 정의 목록보기.
  2. 회전 할 때 OnCreateView 및 OnActivityCreate가 두 번 호출됩니다. 내가 전화를 회전하고 난에 클릭 한 후 ListView에가 표시되면
  3. , 난 다음 오류가 발생합니다 :
내 주요 단편 방법입니다

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131034209, class android.widget.ListView) with Adapter(class 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): Skipped 39 frames! The application may be doing too much work on its main thread. 02-04 13:36:07.451: W/View(7237): requestLayout() improperly called by android.widget.ListView{42079068 IFED.VC. ......ID -360,0-0,778 #7f050041 app:id/list_slidermenu} during layout: running second layout pass

누구든지 나를 도울 수 있습니까? Thx : D

+0

onCreate()의 ListAdapter에서'notifyDataSetChanged()'메소드를 호출 하시겠습니까? –

+0

@joaquin 아니요,하지만 Acvitivity의 onCreate 또는 Fragment의 onActivityCreated에 있습니까? 매개 변수로 어댑터를 사용하여 notifyDateSetChanged를 호출해야합니다. – Natanael

+0

각 조각의 onCreateView에 넣으십시오. –

답변

1

방금 ​​오리엔테이션 변경 사항을 처리 할 때이 문제가 발생했습니다. 죄송합니다 답변을 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); 

     } 
    } 
} 

나는 활동을 다시 할 때 문제가 (예 : ListView에 같은 ID를 가진 뷰처럼) 우리에게 캐싱 변수 모든 시간을 절약하려고 라인을 따라 어딘가에서 유래 생각 + 단편 - 그러나 모든 상황에서 새 어댑터를 설정하면 문제가 발생합니다.

+0

그건 나를 위해 작동하지 않았다. 어쩌면 다른 컨텍스트에서 작동 할 수도 있습니다. 대답에 의해 Thx. 나는 질문을 갱신하고, 나는 기록을 남겼다. – Natanael

+0

불완전한 대답에 대해 유감스럽게 생각한다면, 그것은 세 번째 문제 (심지어 그 경우)를 없애 버렸을뿐입니다. 그러나 액티비티와 프래그먼트는 어떻게 인터페이싱합니까? 프래그먼트 콜백이 설정된 시점을 볼 수 없습니다. 또한, parseQueryEvents가 두 번 이상 호출되는 경우에는 부작용이 생깁니다.(문제가 정상적으로 발생하는지 확인하려고 시도하십시오.) 두 가지 모두 잠재적 인 버그입니다. – MDragon00

+0

위의 코드를 추가 한 후에도 여전히 응용 프로그램이 중단되면 해당 전체 로그캣 오류 (줄 번호가있는 위치 포함)를 게시하십시오. – MDragon00