기존에 안드로이드에서 많이 사용하던 ListView의 확장판? 이라고 생각하시면 됩니다.
ListView와 리스트를 보여주는 것이 목적이지만, RecyclerView는 생선한 뷰 객체를 재사용합니다.
만약1000개의 리스트가 있으면 ListView는 1000개의 뷰 객체를 생성하지만, RecyclerView는 화면에 보이는만큼 뷰 객체를 생성하고 재사용합니다.
리스트가 몇 개 없으면 둘 다 상관없지만, 리스트 많을수록 RecyclerView를 사용하는 것이 좋습니다.
먼저 레이아웃 파일에 RecyclerView를 추가해줍니다.
저는 MainActivity에 추가해볼게요!
res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/list_rv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.recyclerview.widget.RecyclerView>
</androidx.constraintlayout.widget.ConstraintLayout>
리스트에 표시될 아이템 레이아웃입니다.
어떻게 표현할지는 각자 맞게 작성하시면 됩니다.
res/layout/list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/item_board">
<TextView
android:id="@+id/item_board_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8sp"
android:layout_marginLeft="8sp"
android:textSize="24sp"
android:textStyle="bold"
android:text="TITLE" />
<TextView
android:id="@+id/item_board_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8sp"
android:ellipsize="end"
android:maxLines="1"
android:text="Contents"
android:textSize="16sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8sp"
android:orientation="horizontal">
<TextView
android:id="@+id/item_board_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:textSize="16sp"
android:text="Time" />
<TextView
android:id="@+id/item_board_writer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:textSize="16sp"
android:text="Writer" />
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
리스트 아이템에 들어갈 실제 데이터들을 관리하는 부분
Board.java
package com.example.myapplication;
public class Board {
private String title;
private String contents;
private String time;
private String writer;
public Board(String title, String contents, String time, String writer) {
this.title = title;
this.contents = contents;
this.time = time;
this.writer = writer;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
}
위에서 작성했던 아이템 레이아웃(list_item.xml)과 데이터(Board.java)를 연결하는 역할
BoardAdapter.java
package com.example.myapplication;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class BoardAdapter extends RecyclerView.Adapter<BoardAdapter.BoardViewHolder>{
//데이터 리스트
private List<Board> dataList;
public BoardAdapter(List<Board> dataList){
this.dataList = dataList;
}
@NonNull
@Override
public BoardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//ViewHolder 객체 생성 후 리턴.
//작성한 list_iem.xml 를 생성하는 부분이라고 생각하시면 됩니다.
return new BoardViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull BoardViewHolder holder, int position) {
// ViewHolder 가 재활용 될 때 사용되는 메소드
Board data = dataList.get(position);
holder.title.setText(data.getTitle());
holder.contents.setText(data.getContents());
holder.time.setText(data.getTime());
holder.writer.setText(data.getWriter());
}
@Override
public int getItemCount() {
// 전체 데이터의 개수 조회
return dataList.size();
}
public class BoardViewHolder extends RecyclerView.ViewHolder {
//ViewHolder 에 필요한 데이터들
private TextView title;
private TextView contents;
private TextView time;
private TextView writer;
public BoardViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.item_board_title);
contents = itemView.findViewById(R.id.item_board_content);
time = itemView.findViewById(R.id.item_board_time);
writer = itemView.findViewById(R.id.item_board_writer);
}
}
}
MainAcitivty의 RecyclerView에 연결해주면 끝.
MainActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView mPostRecyclerView;
private BoardAdapter mAdapter;
private List<Board> mDatas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPostRecyclerView =findViewById(R.id.list_rv);
mDatas = new ArrayList<>();
mDatas.add(new Board("title1","contents1","time1","winter1"));
mDatas.add(new Board("title2","contents2","time2","winter2"));
mDatas.add(new Board("title3","contents3","time3","winter3"));
mDatas.add(new Board("title4","contents4","time4","winter4"));
mAdapter = new BoardAdapter(mDatas);
mPostRecyclerView.setAdapter(mAdapter);
mPostRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
}
결과
추가했던 4개의 리스트가 정상적으로 표시!!
안드로이드 MPAndroidChart 사이즈 작아지는 현상 (0) | 2023.01.16 |
---|---|
[Android] Android Context란? (0) | 2022.01.23 |
[Android] 커스텀 다이얼로그(CustomDialog) 구현하기 ClickListener, callback 기능추가 (0) | 2022.01.20 |
android calendar event 데이터 표시 (문제 해결) (6) | 2020.05.12 |