본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/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 - 배치 관리자를 사용하는데 3가지가 있다.(Linear, Grid, Staggerd Grid ) Layout Manager가 있다.

 

이번 예제에서는 Linear Layout Manager를사용해보았다.

두개의 라이브러리 추가하자. (cardview, recyclerview)

대량의 데이터

아이템 레이아웃 만들기

이제 어댑터를 만들자.

MyAdapter.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
53
54
55
56
57
58
59
60
61
62
 
 
import androidx.annotation.NonNull;
 
 
public class MyAdapter extends RecyclerView.Adapter {
 
    ArrayList<String> datas;
    LayoutInflater inflater;
 
    public MyAdapter(ArrayList<String> datas, LayoutInflater inflater) {
        this.datas = datas;
        this.inflater = inflater;
    }
 
    //이 메소드가 실행된다면 재활용할 뷰가 없다는 뜻임.
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //이 메소드안에서 리사이클러뷰가 보여줄
        //뷰를 만들어 내서 ViewHoler를 리턴함 (like. getView()와 비슷함)
        View itmeview= inflater.inflate(R.layout.listview_item,parent,false);
 
        //itemView를 보관하는 ViewHolder객체 생성
        VH holder= new VH(itmeview);
        return holder;
    }
 
    //아이템뷰에 데이터들 연결하는 메소드 : 항목마다 실행됨
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        //아이템뷰를 보관하고 있는 VH를 다운캐스팅
        VH vh= (VH) holder;
 
        String s= datas.get(position);
        vh.tv.setText(s);
    }
 
    @Override
    public int getItemCount() {
        return datas.size();
    }
 
    //이너 클래스
    class VH extends RecyclerView.ViewHolder{
 
        TextView tv;
 
        public VH(@NonNull View itemView) {
            super(itemView);
            tv=itemView.findViewById(R.id.tv);
        }
    }// VH class..
}
 
 
 

이제 배치 관리자 (Linear, Grid, Staggerd Grid  Layout Manager)를 사용해야 화면에 보일 것이다.

배치 관리자를 .xml에 추가하지 않으면, 화면에 안보인다.

 

activity_main.xml 에 둘 줄만 추가하면 된다.

그리고 목록을 눌렀을 때, 반응을 해보자. Toast를 사용할 것이기 때문에 MyAdapter를 조금 바꿔야한다.

이렇게 수정하고 MainActivity.java도 수정한다.

<실행 화면>

목록을 터치하면 해당 Position번째 값이 나온다.

여기서 GridLayoutManager도 추가로 알아보겠다. 간단하다.

 

<실행 화면>

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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">
 
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFFFFF"
        android:padding="16dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        android:orientation="vertical">
 
 
 
</RelativeLayout>
 
 
 

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
36
37
38
39
40
41
 
 
 
 
public class MainActivity extends AppCompatActivity {
 
    RecyclerView recyclerView;
 
    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");
        datas.add("hhh");
 
        recyclerView=findViewById(R.id.recyclerview);
        adapter=new MyAdapter(datas, this);
        recyclerView.setAdapter(adapter);
 
        //GridLayoutManager적용해 보기
        GridLayoutManager layoutManager= new GridLayoutManager(this,2);
        recyclerView.setLayoutManager(layoutManager);
    }
}
 
 
 

 

listview_item.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
    android:layout_width="match_parent"
    android:layout_height="80dp"
    app:cardCornerRadius="8dp"
    app:cardBackgroundColor="@color/colorPrimary"
    app:contentPadding="16dp"
    app:elevation="4dp"
    android:layout_marginTop="4dp"
    android:layout_marginBottom="4dp">
 
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello"
        android:textColor="#FFFFFF"
        android:textStyle="bold"
        android:textSize="24sp"/>
 
 
 
 

MyAdapter.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
import android.content.Context;
 
import androidx.annotation.NonNull;
 
 
public class MyAdapter extends RecyclerView.Adapter {
 
    ArrayList<String> datas;
   // LayoutInflater inflater;
    Context context;
 
    public MyAdapter(ArrayList<String> datas, Context context) {
        this.datas = datas;
        this.context = context;
    }
 
    //이 메소드가 실행된다면 재활용할 뷰가 없다는 뜻임.
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //이 메소드안에서 리사이클러뷰가 보여줄
        //뷰를 만들어 내서 ViewHoler를 리턴함 (like. getView()와 비슷함)
 
        LayoutInflater inflater=LayoutInflater.from(context);
        View itmeview= inflater.inflate(R.layout.listview_item,parent,false);
 
        //itemView를 보관하는 ViewHolder객체 생성
        VH holder= new VH(itmeview);
        return holder;
    }
 
    //아이템뷰에 데이터들 연결하는 메소드 : 항목마다 실행됨
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        //아이템뷰를 보관하고 있는 VH를 다운캐스팅
        VH vh= (VH) holder;
 
        String s= datas.get(position);
        vh.tv.setText(s);
    }
 
    @Override
    public int getItemCount() {
        return datas.size();
    }
 
    //이너 클래스
    class VH extends RecyclerView.ViewHolder{
 
        TextView tv;
 
        public VH(@NonNull final View itemView) {
            super(itemView);
            tv=itemView.findViewById(R.id.tv);
 
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //클릭된 아이템뷰가 리사이클러뷰에서
                    //몇번째 index(position)인지 알아내기
                    int position= getLayoutPosition();
                    Toast.makeText(context, position+"",Toast.LENGTH_SHORT).show();
                }
            });
        }
    }// VH class..
}
 
 
 

댓글