티스토리 뷰

기존에 TabActivity를 통해 만들었던 앱을 Fragment 형식으로 변경하면서
ListActivity도 ListFragment로 큰 문제 없이 변경했는데

트위터 앱처럼 스크롤을 끝까지 내리면
자동으로 다음 목록이 붙어 나오게 하려는 목적으로 구글링 했고
GitHub에서 https://github.com/shontauro/android-pulltorefresh-and-loadmore를 찾게 되었고
적용하려 보니 몇가지 오류가 발생했다.

  1. 샘플에 있는 ListActivity들은 어떻게 ListFragment로 적용해야 하나?
  2. setListShown(boolena); setListShownNoAnimation(boolean); 등에서 발생하는 IllegalStateException과 같은 오류는 어떻게 잡아야 하나?
위의 문제들을 잡아 LoadMoreListView를 ListFragment에 적용하는법을 알아본다.

1. Activity로 되어 있는 샘플 코드를 참고하여 Fragment로 이전하기

Layout XML의 경우 https://github.com/shontauro/android-pulltorefresh-and-loadmore 설명대로 <ListView />을 찾아 바꿔준다.

https://github.com/shontauro/android-pulltorefresh-and-loadmore/blob/master/pull-load-example/src/com/android/widget/example/PullAndLoadExampleActivity.java

위 주소의 샘플 코드를 보면 ListActivity에서 상속받는데 자신의 소스에선 ListFragment에서 상속받도록 하고

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // LoadMoreListView 커스텀뷰 사용
    View view = inflater.inflate(R.layout.list, container, false);
    return view;
}

를 추가하고
(위에서 R.layout.list는 <com.costum.android.widget.PullAndLoadListView />가 있는 레이아웃.)

public void onCreate(...) { } 의 함수명부터 setContentView(...); 까지를

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ......
}
로 치환해주면 된다.

2. ListFragment적용시 특정 함수 오류 문제

setListShown(); 과 같은 함수 사용시 IllegalStateException과 같은 오류가 발생하는데
stackOverflow에서 찾은 답변을 보니 커스텀 리스트뷰를 만들어줘야 하는데
즉, ListFragment에 커스텀뷰를 사용시 레이아웃 XML 역시 고유의  요소들을 포함하도록 상속받는 느낌으로 작성해줘야 하며 해당 고유 기능을 보장하도록 커스텀 리스트뷰 클래스를 생성하여 그것을 자신의 ListFragment 클래스의 부모클래스로 하면 된다는 것이다.

stackOverflow 관련 링크의 선택된 답변 클래스와 레이아웃 XML을 신규로 작성하고
레이아웃 XML 내용 중
<ListView android:id="@android:id/list" />를
<com.costum.android.widget.PullAndLoadListView android:id="@android:id/list" />로 치환.

이후 자신의 ListFragment 클래스가 TestListFragment이면

public class TestListFragment extends FixedListFragment { ... }

과 같이 하면 된다.


댓글