반응형
◎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"?>
xmlns:app="http://schemas.android.com/apk/res-auto"
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
|
package com.lcw.ex53listviewholder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
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);
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
|
package com.lcw.ex53listviewholder;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
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
|
package com.lcw.ex53listviewholder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
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);
}
//2. bind view
//처음 만들때는 똑같이 findview를 하지만 다시 재활용할때, findview를 하지 않는다. 데이터가 많을때 훨씬 빨라진다.
ViewHolder holder= (ViewHolder) view.getTag();
return view;//리스트뷰에 만들 뷰 리턴
}
//이너 클래스
class ViewHolder{
//아이템뷰 안에 있는 뷰들
TextView tv;
public ViewHolder(View itemView) {
tv= itemView.findViewById(R.id.tv);
}
}// ViewHolder class ...
}
|
이러면 데이터가 많을수록 빨라진 것을 느낄 것이다. ViewHolder는 개인 만든 클래스다. 이걸 보고 구글이 비슷한 것을 만들었다. 그것이 바로 RecyclerView 이다.
반응형
'안드로이드 웹앱 콘테츠 개발자 양성(국비지원) > Adapter View' 카테고리의 다른 글
Android Studio Material Design 그외 4 (RecyclerView 2-1) 많이 사용됨! [중요!!] (0) | 2019.10.02 |
---|---|
Android Studio Material Design 그외 4(RecyclerView ) (0) | 2019.10.01 |
Android Studio ViewPager (0) | 2019.09.25 |
Android Studio Adapter View - List View 3 (0) | 2019.09.17 |
Android Studio Adapter View -ListView 2 (0) | 2019.09.17 |
댓글