2012-12-10 16 views
1

기본적으로 목록보기 인 조각이 있습니다. 부모 액티비티는 서비스에서 명단 항목 목록을 검색하는 메소드를 호출합니다. 데이터가 서비스에서 돌아 오면 나는 updateRosterItems를 호출하고 Roster 항목의 ArrayList를 통해 전달합니다. 문제는 그것이 처음에는 작동하지만 다른 탭을 선택한 다음 조각으로 탭으로 돌아 오면 getActivity()가 null을 반환하고 ArrayAdapter에 데이터를 연결할 수 없다는 것입니다.getActivity는 Fragment에 null을 반환합니다.

public void updateRosterList(ArrayList<RosterInfo> rosterItems) 
{ 
    if(_adapter == null) 
    { 
     _adapter = new RosterItemAdapter(getActivity(), R.layout.roster_listview_item, rosterItems); 
    } 

    Activity activity = getActivity(); 
    if(activity != null) 
    { 
     ListView list = (ListView)activity.findViewById(R.id.lstRosterItems); 

     list.setAdapter(_adapter); 
     _adapter.notifyDataSetChanged(); 
    } 
} 

나는 조각이 부착되기 전에 호출되는 코드에 의해 발생하는 유사한 문제에 대해 읽었습니다 :

은 updateRosterItems 기능에 대한 코드입니다. 내 질문에, onAttach 호출 될 때까지 updateRosterList에 대한 호출을 지연시킬 수있는 방법이 있습니까? 내가 감당할 수있는 해결책은 getActivity()가 null을 반환하고 프래그먼트의 private 변수에 데이터를 저장하고 onAttach 메소드가 varialbe에 데이터가 있는지 확인한 다음 어댑터에서 업데이트를 호출하는 것입니다. 이것은 조금 해키 것 같습니다. 어떤 아이디어?

답변

2

업데이트 :이 작업을 통해 문제를 해결할 수있었습니다. 나는 안드로이드 개발에 아주 익숙하고 해결책으로 나에게 약간 해키처럼 보인다. 더 좋은 방법이 있습니까? 기본적으로 updateRosterList 함수는 조각 외부에서 호출되는 함수입니다.

public class RosterListFragment extends Fragment { 

RosterItemAdapter _adapter = null; 
private ArrayList<RosterInfo> _items; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    return inflater.inflate(R.layout.roster_listview, container, false); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 

    if(_items != null) 
    { 
     performUpdateRosterList(_items); 
    } 

} 

public void updateRosterList(ArrayList<RosterInfo> rosterItems) 
{ 
    Activity activity = getActivity(); 
    if(activity != null) 
    { 
     performUpdateRosterList(rosterItems); 
    } 
    else 
    { 
     _items = rosterItems; 
    } 
} 

private void performUpdateRosterList(ArrayList<RosterInfo> rosterItems) 
{ 
    Activity activity = getActivity(); 
    if(_adapter == null) 
    { 
     _adapter = new RosterItemAdapter(activity, R.layout.roster_listview_item, rosterItems); 
    } 

    ListView list = (ListView)activity.findViewById(R.id.lstRosterItems); 

    list.setAdapter(_adapter); 
    _adapter.notifyDataSetChanged(); 
} 

} 
1

정확 합니다만 활동이 아직 첨부되지 않았습니다. 이것을 처리 할 수있는 두 가지 방법이 있습니다.

  1. 활동이 첨부 될 때까지 변경하지 마십시오. 아마도 로스터 아이템을 제외하고 나중에 업데이트해야합니다.
  2. 컨텍스트에서 업데이터 기능으로 전달하십시오.

개인적으로는 처음에는 더 나은 경로라고 할 수 있지만 어느 쪽이라도 정상적으로 작동 할 수 있습니다.

관련 문제