RecyclerView를 사용하는 방법은 데이터를 보여줄 화면(xml) 하나와
어뎁터를 통해 데이터와 화면을 연결해서 RecyclerView에 보여줍니다.
만약에 데이터별로 각자 다른 화면에 보여주고 싶다면 어떻게 해야 하는지
이번에 알아보겠습니다.
- 설명 -
데이터를 담을 그릇입니다.
2021.12.31 - [안드로이드] - [안드로이드 스튜디오] 자바 클래스 생성하는 방법
public class Model1 {
private String model1Nm;
public Model1(String model1Nm) {
this.model1Nm = model1Nm;
}
public String getModel1Nm() {
return model1Nm;
}
public void setModel1Nm(String model1Nm) {
this.model1Nm = model1Nm;
}
}
public class Model2 {
private String model2Nm;
public Model2(String model2Nm) {
this.model2Nm = model2Nm;
}
public String getModel2Nm() {
return model2Nm;
}
public void setModel2Nm(String model2Nm) {
this.model2Nm = model2Nm;
}
}
- 설명 -
모델을 담을 클래스입니다.
public class Item {
int viewType; //화면타입
Object object; //데이터
public Item(int viewType, Object object) {
this.viewType = viewType;
this.object = object;
}
public int getViewType() {
return viewType;
}
public void setViewType(int viewType) {
this.viewType = viewType;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
- 설명 -
데이터를 보여줄 화면입니다.
2022.01.01 - [안드로이드] - [안드로이드 스튜디오] 레이아웃 추가하는 방법
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<TextView
android:id="@+id/textModel1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_light"
android:gravity="center"
android:textColor="@android:color/white"
android:textSize="30sp"
android:textStyle="bold" />
</androidx.cardview.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<TextView
android:id="@+id/textModel2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_green_light"
android:gravity="center"
android:textColor="@android:color/white"
android:textSize="30sp"
android:textStyle="bold" />
</androidx.cardview.widget.CardView>
- 설명 -
화면과 데이터를 연결해주는 클래스입니다.
1. getItemViewType을 통해 viewType을 리턴합니다.
2. onCreateViewHolder메서드의 viewType에 리턴한
값이 들어가 있습니다.
3. 조건문에 따라 model1_view을 보여줄지
model2_view를 보여줄지 정합니다.
4. onBindViewHolder메서드에서도 viewType에 따라
어떤 데이터를 어떤 화면에 보여줄지 정합니다.
public class ModelAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Item> items;
public ModelAdapter(List<Item> items) {
this.items = items;
}
//화면 설정
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//0 == model1 , 1 == model2
if(viewType == 0){
return new Model1ViewHolder(LayoutInflater.from(parent.getContext()).inflate(
R.layout.model1_view, parent, false));
}else{
return new Model2ViewHolder(LayoutInflater.from(parent.getContext()).inflate(
R.layout.model2_view, parent, false));
}
}
//데이터 설정
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(getItemViewType(position) == 0){
Model1 model1 = (Model1) items.get(position).getObject();
((Model1ViewHolder) holder).setModel1Data(model1);
}else{
Model2 model2 = (Model2) items.get(position).getObject();
((Model2ViewHolder) holder).setModel2Data(model2);
}
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public int getItemViewType(int position) {
return items.get(position).getViewType();
}
//화면1
static class Model1ViewHolder extends RecyclerView.ViewHolder{
private TextView textModel1;
public Model1ViewHolder(@NonNull View itemView) {
super(itemView);
textModel1 = itemView.findViewById(R.id.textModel1);
}
public void setModel1Data(Model1 model1){
textModel1.setText(model1.getModel1Nm());
}
}
//화면2
static class Model2ViewHolder extends RecyclerView.ViewHolder{
private TextView textModel2;
public Model2ViewHolder(@NonNull View itemView) {
super(itemView);
textModel2 = itemView.findViewById(R.id.textModel2);
}
public void setModel2Data(Model2 model2){
textModel2.setText(model2.getModel2Nm());
}
}
}
<?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"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:padding="8dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
/>
</LinearLayout>
- 설명 -
1. 반복문(for)을 통해 샘플데이터를 생성합니다.
2. Model1에 데이터를 담고, List <Item>에 model1을 담습니다.
3. Model2에 데이터를 담고, List <Item>에 model2를 담습니다.
4. List <Item>를 Adapter에 적용하고, Adapter을 RecycelrView에 적용합니다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
List<Item> items = new ArrayList<>();
//샘플 데이터 생성
for(int i = 0; i < 10; i++){
Model1 model1 = new Model1("model1_item" + i);
items.add(new Item(0, model1));
Model2 model2 = new Model2("model2_item" + i);
items.add(new Item(1, model2));
}
//데이터 적용
recyclerView.setAdapter(new ModelAdapter(items));
}
}//MainActivity
2022.04.11 - [안드로이드] - [안드로이드] 액티비티(Activity)에서 프래그먼트(Fragment) 데이터 전달하는 방법
2022.04.12 - [안드로이드] - [안드로이드] 프래그먼트(Fragment)에서 액티비티(Activity) 데이터 전달하는 방법
2022.04.07 - [안드로이드] - [안드로이드] 코드(MainActivity)에서 배경 색상 바꾸는 다양한 방법
[안드로이드] 클립보드(Clipboard) 텍스트 복사(Copy)&붙여넣기(paste) 하는 방법 (0) | 2022.04.15 |
---|---|
[안드로이드] 레이아웃 배경색상 애니메이션 적용하는 방법 (0) | 2022.04.14 |
[안드로이드] 프래그먼트(Fragment)에서 액티비티(Activity) 데이터 전달하는 방법 (0) | 2022.04.12 |
[안드로이드] 액티비티(Activity) 에서 프래그먼트(Fragment) 데이터 전달하는 방법 (0) | 2022.04.11 |
[안드로이드] Tab Custom Animation part3 - 탭 애니메이션 적용 (0) | 2022.04.10 |
댓글 영역