이전글 - [Android] - CoordinatorLayout Behavior 사용기
이전글 - [Android] - CoordinatorLayout App Bar 드래그 비활성화 + 상단 스크롤 구현
구글에 항상 안드로이드에 관한 방법과 설명이 많지만
내가 구현해논 코드에서 원하는 동작이 바로바로 잘 되지 않는다 😵
오늘은 동적 로드 기능을 구현해 보았다.
몇줄 안되지만 이것또한 엄청 돌고 돌아 성공했다.
이전글을 참고하면 알겠지만 내가 만들어 논 레이아웃은 상당히 복잡하다 ㅎㅎ..;;
나의 RecyclerView는 Fragment에서 NestedScrollView 안에 위치해 있다.
( Coordinator 을 사용했기 때문이다. )
아래는 RecyclerView와 어댑터를 설정하는 부분을 따로 객체로 만들어 사용하는 클래스다.
구글에 보면 보통 액티비티에서 바로 만들어서 어댑터를 설정해 주는데
나는 다른 곳에도 쓸 곳이 많아 클래스를 따로 만들어 주었다.
우리가 주목해야 할 코드는 아래 부분의 동적 로드 파트이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | public class RecyclerListView { private RecyclerView recyclerView; private RecyclerViewAdapter adapter; private ArrayList<ListViewItemData> listViewItems; /** * 생성자 * listViewItems 생성 및 어댑터 설정 */ public RecyclerListView(Context context, View view, Fragment fragment) { listViewItems = new ArrayList<ListViewItemData>(); adapter = new RecyclerViewAdapter(listViewItems, R.layout.group_listview, fragment); recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(context.getApplicationContext())); recyclerView.setItemAnimator(new DefaultItemAnimator()); } public RecyclerListView(Context context, View view, AppCompatActivity activity ) { listViewItems = new ArrayList<ListViewItemData>(); adapter = new RecyclerViewAdapter(listViewItems, R.layout.group_listview, activity); recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(context.getApplicationContext())); recyclerView.setItemAnimator(new DefaultItemAnimator()); } // Default 값, 테스트 용 public void addItem() { ListViewItemData listViewItem = new ListViewItemData(); listViewItems.add(listViewItem); } /** 동적 로딩을 위한 NestedScrollView의 아래 부분을 인식 **/ public void loadItems(NestedScrollView nestedScrollView, final Context context) { nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { @Override public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())) { //TODO add listItems Toast.makeText(context, "loading", Toast.LENGTH_SHORT).show(); addItem(); // 어댑터에 연결된 ListView를 갱신 adapter.notifyDataSetChanged(); } } }); } } | cs |
구글에 보면 RecyclerView에 onScrollChangeListener을 설정해 주었는데
나는 NestedScrollView 안에 RecyclerView가 있다보니
인식을 제대로 하지 못했다.
따라서 NestedScrollView에 설정을 해주었다.
이때 중요한 메소드가 adapter.notifyDataSetChanged();이다.
주석에도 적어 놨듯이 어댑터에 연결된 ListView를 갱신 해주는 메소드이다.
이 문장을 적지 않으면 배열에 데이터는 추가 되지만
화면 갱신이 되지않아 화면이 바뀌지 않는다.
아래 구현한 화면이다 ❣
뿌듯 💕
'~ 2024.08' 카테고리의 다른 글
CSS 내부 스타일시트, 외부 스타일 시트 (1) | 2018.05.04 |
---|---|
[ One Hour One Life ( 원아월 원라이프 ) ] 평화로운 큰 마을에서의 일상 🤗 (1) | 2018.05.02 |
CoordinatorLayout App Bar 드래그 비활성화 + 상단 스크롤 구현 (2) | 2018.05.01 |
RecyclerView 사용하기 + Click 이벤트 (2) | 2018.04.30 |
searchView 아이콘 변경하기 (0) | 2018.04.28 |