Hello,

kok nae-ga ha-myun an-dweneun MAGIC...🧚

안드로이드

안드로이드 recyclerview 동적 로드 구현 하기

✿도담도담 2018. 5. 1. 23:51

이전글 - [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를 갱신 해주는 메소드이다.


이 문장을 적지 않으면 배열에 데이터는 추가 되지만

화면 갱신이 되지않아 화면이 바뀌지 않는다.



아래 구현한 화면이다 ❣



뿌듯 💕