본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/Adapter View

Android Studio Material Design 그외 4(RecyclerView 하기 전 이야기)

by 차누감 2019. 10. 1.

◎Material Design : Gogle 디자인 가이드 라인

①Navigation Drawer

②Toolbar

③AppBar Layout, TabLayout

④Floating Action Button, SnackBar - Toast와 비슷하지만 업그레이드 된거라 생각하면 됨.

⑤CoordinatorLayout, NestedScrollView

⑥CollapsingToolbarLayout - 무너질 수 있는 툴바

RecyclerView

 

 

 

 

activity_main.xml 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <ListView
       android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp"
        android:background="#FFFFFF"
        android:divider="#FFFFFF"
        android:dividerHeight="4dp">
<!--       divider 구분선 색, dividerHeight 구분선 높이값 -->
    </ListView>
 
</RelativeLayout>
 
 
 

이제 대량의 데이터 만들자.

이제 어댑터를 만들자.

 

MaAdapter.java 코드

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
 
 
 
public class MyAdapter extends BaseAdapter {
 
    ArrayList<String> datas;
    LayoutInflater inflater;
 
    public MyAdapter(ArrayList<String> datas, LayoutInflater inflater) {
        this.datas = datas;
        this.inflater = inflater;
    }
 
    @Override
    public int getCount() {
        return datas.size();
    }
 
    @Override
    public Object getItem(int position) {
        return datas.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
 
        //1. new view
        //재활용할 뷰가 없는가?
        if(view==null) view= inflater.inflate(R.layout.listitem, viewGroup, false);
 
        //2. bind view
        TextView tv= view.findViewById(R.id.tv);
 
        String s= datas.get(position);
        tv.setText(s);
 
        return view;//리스트뷰에 만들 뷰 리턴
    }
}
 
 
 

이제 화면에 보여주자. (대량의 데이터와 어댑터를 이용해서)

 MainActivity.java

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
 
 
 
 
public class MainActivity extends AppCompatActivity {
 
    ListView listView;
    ArrayList<String> datas=new ArrayList<>();
 
    MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //데이터 추가
        datas.add("aaa");
        datas.add("bbb");
        datas.add("ccc");
        datas.add("ddd");
        datas.add("eee");
        datas.add("fff");
        datas.add("ggg");
 
        listView=findViewById(R.id.listview);
        adapter=new MyAdapter(datas, getLayoutInflater());
        listView.setAdapter(adapter);
    }
}
 
 
 

<실행 화면>

여기서 문제가 있다. 대량의 데이터면 이제 화면 스크롤 할때 굉장히 느려진다. (findview를 할때 많이 느려짐)

 

MyAdapter 코드를 수정하자.

 

MyAdapter.java 수정 코드( ViewHolder클래스를 만들고, 불필요한 findview를 하지 않는다.)

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 
 
 
public class MyAdapter extends BaseAdapter {
 
    ArrayList<String> datas;
    LayoutInflater inflater;
 
    public MyAdapter(ArrayList<String> datas, LayoutInflater inflater) {
        this.datas = datas;
        this.inflater = inflater;
    }
 
    @Override
    public int getCount() {
        return datas.size();
    }
 
    @Override
    public Object getItem(int position) {
        return datas.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
 
        //1. new view
        //재활용할 뷰가 없는가?
        if(view==null) {
            view = inflater.inflate(R.layout.listitem, viewGroup, false);
 
           //만들어진 뷰(view)를 보관
            ViewHolder holder=new ViewHolder(view);
            view.setTag(holder);
 
        }
        //2. bind view
        //처음 만들때는 똑같이 findview를 하지만 다시 재활용할때, findview를 하지 않는다. 데이터가 많을때 훨씬 빨라진다.
        ViewHolder holder= (ViewHolder) view.getTag();
 
        String s= datas.get(position);
        holder.tv.setText(s);
 
        return view;//리스트뷰에 만들 뷰 리턴
    }
 
    //이너 클래스
    class ViewHolder{
 
        //아이템뷰 안에 있는 뷰들
        TextView tv;
 
        public ViewHolder(View itemView) {
            tv= itemView.findViewById(R.id.tv);
 
        }
    }// ViewHolder class ...
 
}
 
 
 

이러면 데이터가 많을수록 빨라진 것을 느낄 것이다. ViewHolder는 개인 만든 클래스다. 이걸 보고 구글이 비슷한 것을 만들었다. 그것이 바로 RecyclerView 이다.

댓글