반응형

1. 리스트 형식, 2. 그리드 형식, 3. 스태그 그리드 형식

1. 리스트 형식

  • 2가지 형태의 셀을 가지는 리스트

 

app build.gradle

implementation 'androidx.recyclerview:recyclerview:1.1.0'

선언부

RecyclerView recycler;
LinearLayoutManager linearLayoutManager;
MyListAdapter adapter;
ArrayList<DataType> datas;

초기화, 리스트 데이터 생성

recycler = findViewById(R.id.recycler);

linearLayoutManager = new LinearLayoutManager(this);
adapter = new MyListAdapter();

recycler.setLayoutManager(linearLayoutManager);
recycler.setAdapter(adapter);

//테스트 데이터
datas = new ArrayList<>();
for(int i=0; i<100; i++) {
    if(i % 2 == 0) {
        datas.add(new DataType1(i));
    } else {
        datas.add(new DataType2(i + ""));
    }
}

데이터 클래스

class DataType {}
class DataType1 extends DataType {
    int num = 0;
    public DataType1(int num) {
        this.num = num;
    }
}
class DataType2 extends DataType {
    String str = "";
    public DataType2(String str) {
        this.str = str;
    }
}

Adapter

public class MyListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private int VIEWTYPE_1 = 0;
    private int VIEWTYPE_2 = 1;

    public class Type1ViewHolder extends RecyclerView.ViewHolder {
        TextView tv_num;
        public Type1ViewHolder(View view) {
            super(view);
            this.tv_num = view.findViewById(R.id.tv_num);
        }
    }
    public class Type2ViewHolder extends RecyclerView.ViewHolder {
        TextView tv_str;
        public Type2ViewHolder(View view) {
            super(view);
            this.tv_str = view.findViewById(R.id.tv_str);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        if(viewType == VIEWTYPE_1) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_type1, viewGroup, false);
            Type1ViewHolder viewHolder = new Type1ViewHolder(view);
            return viewHolder;
        } else {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_type2, viewGroup, false);
            Type2ViewHolder viewHolder = new Type2ViewHolder(view);
            return viewHolder;
        }
    }

    @Override
    public int getItemViewType(int position) {
        if(datas.get(position).getClass().getName().equals(DataType1.class.getName())) {
            return VIEWTYPE_1;
        } else {
            return VIEWTYPE_2;
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewholder, int position) {
        //VIEWTYPE_1
        if(datas.get(position).getClass().getName().equals(DataType1.class.getName())) {
            DataType1 dataType1 = (DataType1)datas.get(position);
            ((Type1ViewHolder)viewholder).tv_num.setText(dataType1.num + "");
        }
        //VIEWTYPE_2
        else {
            DataType2 dataType2 = (DataType2)datas.get(position);
            ((Type2ViewHolder)viewholder).tv_str.setText(dataType2.str);
        }
    }

    @Override
    public int getItemCount() {
        return (null != datas ? datas.size() : 0);
    }
}

activity.xml

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

layout_type1.xml, layout_type2.xml

<!-- layout_type1 -->
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#88ffff"
    android:layout_margin="1dp">

    <TextView
        android:id="@+id/tv_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>
</FrameLayout>

<!-- layout_type2 -->
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="#ff88ff"
    android:layout_margin="1dp">

    <TextView
        android:id="@+id/tv_str"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>
</FrameLayout>

2. 그리드 형식

  • 셀의 형식이 2개이면 높이는 그 중에서 큰걸로 결정

 

그리드 레이아웃 매니져 생성 및 사용

GridLayoutManager gridLayoutManager;
gridLayoutManager = new GridLayoutManager(this, 3);
recycler.setLayoutManager(gridLayoutManager);

3. 스태그 그리드 형식

 

스태그 그리드 레이아웃 매니져 생성 및 사용

StaggeredGridLayoutManager staggeredGridLayoutManager;
staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
recycler.setLayoutManager(staggeredGridLayoutManager);

 

프로젝트 소스 다운↓

RecyclerView.zip
0.51MB

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기