1. 라이브러리 추가
1)
https://github.com/bumptech/glide
위 페이지에 나와있는 설명처럼 아래 두 줄을 추가해주면서 url로 사진을 불러올 수 있게 해주는 라이브러리를 추가한다.
1
2
3
4
5
|
dependencies {
...
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
}
|
cs |
2)
Tools -> Firebase -> Realtime Database 에서 Database까지 연결해준다.
2. activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
|
cs |
9~12 - recyclerView 위젯을 추가해주고 id를 지정해준다.
3. User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.example.firebaseliststudy;
public class User {
private String profile;
private String id;
private int pw;
private String userName;
public User(){}
...
}
|
cs |
4~7 - recyclerview에서 띄우고 싶은 정보들을 여기에 변수를 선언해준다.
9 - firebase를 사용할 때는 비어있는 생성자 또한 만들어줘야한다.
11 - 각각의 변수에 대한 Getter, Setter을 만들어준다.
4. list_item.xml
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
|
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_p"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_margin="5dp"
android:src="@drawable/ic_launcher_foreground"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="id"
android:layout_margin="5dp"/>
<TextView
android:id="@+id/tv_pw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="password"/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="username"/>
</LinearLayout>
</LinearLayout>
|
cs |
1~35 - recyclerview의 item를 구성해준다.
7, ~ - 요소들 중에 각각의 item마다 다른 정보를 띄우고 싶은 위젯에는 id를 설정해준다.
5. CustomAdapter.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
|
package com.example.firebaseliststudy;
import ...
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {
private ArrayList<User> arrayList;
private Context context;
public CustomAdapter(ArrayList<User> arrayList, Context context) {
this.arrayList = arrayList;
this.context = context;
}
@NonNull
@Override
public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
CustomViewHolder holder = new CustomViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) {
Glide.with(holder.itemView)
.load(arrayList.get(position).getProfile())
.into(holder.iv_p);
holder.tv_id.setText(arrayList.get(position).getId());
holder.tv_pw.setText(String.valueOf(arrayList.get(position).getPw()));
holder.tv_name.setText(arrayList.get(position).getUserName());
}
@Override
public int getItemCount() {
return (arrayList != null? arrayList.size() : 0);
}
public class CustomViewHolder extends RecyclerView.ViewHolder {
ImageView iv_p;
TextView tv_id;
TextView tv_pw;
TextView tv_name;
public CustomViewHolder(@NonNull View itemView) {
super(itemView);
this.iv_p = itemView.findViewById(R.id.iv_p);
this.tv_id = itemView.findViewById(R.id.tv_id);
this.tv_pw = itemView.findViewById(R.id.tv_pw);
this.tv_name = itemView.findViewById(R.id.tv_name);
}
}
}
|
cs |
5 - 상속해주는 것이 중요하다.
10~13 - 생성자를 이용해서 매개변수로 ArrayList와 Context를 받아온다.
15~21
18 - 위에서 만들었던 list_item을 view에 담아준다.
19~20 - 그 view를 이용해서 holder를 만든 후 반환해준다.
23~31 - 매개변수로 주어지는 position과 arrayList를 이용해서 적절하게 holder의 위젯에 설정을 한다.
33~36 - item의 개수를 반환하는 함수를 만든다.
38~52 - holder에 담을 위젯들을 설정해준다.
6. 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
42
43
44
45
46
47
48
|
package com.example.firebaseliststudy;
import ...
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private ArrayList<User> arrayList;
private FirebaseDatabase database;
private DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setHasFixedSize(true); //성능 강화
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
arrayList = new ArrayList<>();
database = FirebaseDatabase.getInstance();
databaseReference = database.getReference("User");
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) { //데이터베이스의 데이터를 받아오는 곳
arrayList.clear(); //기존 배열 초기화
for (DataSnapshot snapshot1 : snapshot.getChildren()){
User user = snapshot1.getValue(User.class);
arrayList.add(user);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {// 데이터를 받아오다 에러 발생 시
Log.e("MainActivity", error.toException().toString());
}
});
adapter = new CustomAdapter(arrayList, this);
recyclerView.setAdapter(adapter);
}
}
|
cs |
30~37 - database의 정보에 변화가 있을 때의 이벤트로 동기화를 하기 위해 사용한다.
33~34 - 정보들을 User.java class의 형태로 정보를 받아와서 arrayList에 넣어준다.
7. 결과
위와 같이 Realtime Database에 저장되어있는 정보를
위와 같이 recyclerview에 띄울 수 있다.
'Android App' 카테고리의 다른 글
Notification with Python (FCM) in Android Studio (0) | 2021.12.21 |
---|---|
Room Database in Android Studio (0) | 2021.11.27 |
Login with Firebase in Android Studio (0) | 2021.11.20 |
Kakao login in Android Studio (0) | 2021.11.12 |
Google login in Android Studio (0) | 2021.11.08 |