본문 바로가기
📱Web & Mobile/AndroidStudio

[AndroidStudio] RecyclerView

by inbeom 2023. 8. 20.
728x90

💡 리사이클러뷰(RecyclerView)

"사용자가 관리하는 많은 수의 데이터 집합(Data Set)을 개별 아이템 단위로 구성하여 화면에 출력하는 뷰그룹(ViewGroup)이며, 한 화면에 표시되기 힘든 많은 수의 데이터를 스크롤 가능한 리스트로 표시해주는 위젯"입니다.

 

기존에 리스트 형태의 화면 구성에 사용되던 리스트뷰(ListView)에 "유연함(Flexibility) "과 "성능(Performance)"을 더한, 리스트뷰의 확장판 또는 개선판이라고 볼 수 있습니다.

 

사용 예시!

  • 나타낼 Activity(xml)에 RecyclerView등록
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rvRankList"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="30dp"
    android:scrollbarFadeDuration="0"
    android:scrollbarSize="5dp"
    android:scrollbarThumbVertical="@android:color/darker_gray"
    android:scrollbars="vertical"
    android:layout_weight="1">
</androidx.recyclerview.widget.RecyclerView>
  • 리스트 아이템(xml) 생성 - 아이템 하나의 구조
<?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="wrap_content"
    android:layout_marginBottom="3dp"
    android:background="@drawable/radius_boder_layout">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/ivUserProfile"
            android:layout_marginLeft="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>
        <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/tvUserPoint"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:textSize="9pt"
            android:text="3254"/>
    </LinearLayout>
</LinearLayout>
  • 리스트 아이템 데이터 생성 - 각각의 아이템에 들어갈 데이터를 정의 (constructor, getter&setter)
public class RankListData {
    private String tvUserRank;
    private int ivUserProfile;
    public RankListData(String tvUserRank, int ivUserProfile) {
        this.tvUserRank = tvUserRank;
        this.ivUserProfile = ivUserProfile;
    }
    public String getTvUserRank() {
        return tvUserRank;
    }
    public void setTvUserRank(String tvUserRank) {
        this.tvUserRank = tvUserRank;
    }
    public int getIvUserProfile() {
        return ivUserProfile;
    }
    public void setIvUserProfile(int ivUserProfile) {
        this.ivUserProfile = ivUserProfile;
    }
}
  • 리스트 어댑터 등록
public class RankListAdapter extends RecyclerView.Adapter<RankListAdapter.CustomViewHolder> {
    private ArrayList<RankListData> arrayList;
    public RankListAdapter(ArrayList<RankListData> arrayList) {
        this.arrayList = arrayList;
    }
    @NonNull
    @Override
    public RankListAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // 리스트가 생성될 때 호출 (생명주기)
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ranklist_item, parent, false);
        CustomViewHolder holder = new CustomViewHolder(view);
        return holder;
    }
    @Override
    public void onBindViewHolder(@NonNull RankListAdapter.CustomViewHolder holder, int position) {
    // 리스트가 실제 실행될 때 호출
        holder.tvUserRank.setText(arrayList.get(position).getTvUserRank());
        holder.ivUserProfile.setImageResource(arrayList.get(position).getIvUserProfile());
        holder.itemView.setTag(position);
        // 클릭 이벤트는 필요없음.
    }
    @Override
    public int getItemCount() {
        return (null != arrayList ? arrayList.size() : 0);
    }

    public class CustomViewHolder extends RecyclerView.ViewHolder {
        protected TextView tvUserRank;
        protected ImageView ivUserProfile;
        protected TextView tvUserId;
        protected TextView tvUserPoint;
        public CustomViewHolder(@NonNull View itemView) {
            super(itemView);
            this.tvUserRank = (TextView) itemView.findViewById(R.id.tvUserRank);
            this.ivUserProfile = (ImageView) itemView.findViewById(R.id.ivUserProfile);
        }
    }
}
  • 마지막으로 나타낼 Activity의 JAVA코드에서 리스트 설정 및 값 세팅
// List 설정
recyclerView = (RecyclerView) rootView.findViewById(R.id.rvRankList);
linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);

arrayList = new ArrayList<>();

mainAdapter = new RankListAdapter(arrayList);
recyclerView.setAdapter(mainAdapter);

// list값 세팅
for(int i=1;i<=100;i++){
    RankListData mainData = new RankListData(""+i, R.drawable.user, "Leeinbeom", ""+24397);
    arrayList.add(mainData);
}
mainAdapter.notifyDataSetChanged();
728x90

'📱Web & Mobile > AndroidStudio' 카테고리의 다른 글

[AndroidStudio] PHP 외부 DB연결  (0) 2023.08.20
[AndroidStudio] TMap API  (0) 2023.08.20
[AndroidStudio] SQLite  (0) 2023.08.20
[AndroidStudio] Fragment  (0) 2023.08.20
[AndroidStudio] 에러 노트  (0) 2023.08.20