Fragment로 화면 구성시 발생 할 수 있는 ListView의 Item 갱신 문제
Debugging Note/Android [JAVA, eclipse] 2015. 3. 20. 15:24나를 이틀간 고생 시킨 녀석이 있었다. ListView에 Item를 추가 하는 것이었는데, 뭐랄까... 아놔... 다시 생각해도 열이 난다. Class 로드를 잘못하는 바람에 그 뻘짓을 하다니 말이다.
일단 나는 activity를 하나만 만들고 나머진 모두 fragment로 생성하였다. 그래서 버튼 간의 이벤트에 의해서 다른 fragment를 불러 올 수 있도로 하고 싶었다. 그래서 main activity도 기본만 만들고 fragment에서 그 화면을 구성하였는데, 여기서 첫 화면이 list라서 동적으로 item을 추가하니 그것이 갱신이 안되는 것이었다.
일단 Fragment에 ListView를 생성하고 다음과 같이 onCreatView에 입력을 하였다.
private ArrayList<String> list;
private ListView listview;
private ArrayAdapter<String> adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/** Inflating the layout for this fragment **/
View view = inflater.inflate(R.layout.fragment, null);
list = new ArrayList<String>();
listview= (ListView) view.findViewById(R.id.listview);
adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list);
listview.setAdapter(adapter);
list.add("test1");
list.add("test2");
list.add("test3");
adapter.notifyDataSetChanged();
return view;
}
보면 알겠지만 딱히 Activity에서 ListView를 추가하는 것과 다를바 없다.
하지만 문제는 이것이 아니다. 문제가 되었던 부분은 메인 Activity 에서 Fragment를 띄우는 부분이었다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction().add(R.id.container,
new PlaceholderFragment()).commit();
}
bExitChecker = false;
}
... 생략 ...
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_list, container, false);
return rootView;
}
}
Fragment를 잘 몰라 본인은 빨간색으로 표시한 부분만 수정하고 OnCreate 까진 수정하지 않았다. 왜냐하면 그래도 내가 원하는 xml의 화면이 표시가 되었으니깐, 그런데 이 부분만 수정하니 당연히 어떻게 되겠는가? 현재 Activity는 PlaceholderFragment와 연결이 되어 있으니깐 연신 PlaceholderFragment 만 불러오니 본인이 만든 ListFragment 는 불러오지도 않았던 것이었다. 결국 그래서 PlaceholderFragment 를 ListFragment (fragment_list와 연결 하려고 한 클래스) 로 변경하니 바로 변경 되었다.
그리고 로드를 제대로 안해서 발생된 문제다 보니 브레이크도 걸리지 않아서 나름 당황했던 버그... 역시 내가 초보 개발자구나를 느끼게 해준 문제였다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction().add(R.id.container,
new ListFragment()).commit();
}
bExitChecker = false;
}
... 클래스 정의 삭제 ...
아무튼 다른 분들은 나같은 실수 하지 마시라고 기록 남겨 본다.