전체적인 코드는 아래의 링크에 전문이 첨부되어있다.
2022.11.16 - [개발 언어/Java] - [Android 개발] RecyclerView(Adapter) 예제 코드
리사이클뷰
리사이클뷰는 기존의 ListView보다 좋은 성능을 지니고 있다. 안드로이드 Developers 공식 문서에 따르면 RecyclerView는 대량의 데이터 세트를 효율적으로 표시할 수 있다. 개발자가 데이터를 제공하고 각 항목의 모양을 정의하면 RecyclerView 라이브러리가 필요할 때 요소를 동적으로 생성한다.
필요한 파일은 어댑터, 데이터, 메인 엑티비티이다.
코드 설명
일단 메인 xml에 RecyclerView를 배치한다. 이후 RecyclerView에 각 item항목으로 배치될 레이아웃 xml파일을 만든다. 파일은 res/layout에 우클릭 New > XML > LayoutXML 로 생성한다. xml 파일은 우측에 Design, Split, Code로 화면에 직접 레이아웃을 배치하거나 코드로 구성할 수 있다. Design 화면으로 좌측의 Palatte의 구성요소들을 직접 화면으로 드래그앤드롭해 배치한다.
메인 xml
item의 XML
Component Tree를 참고해 다음과 같이 예제를 만들었다. Code에서 각 객체의 id를 알맞게 설정한다.
item.java
자료에 쓰일 변수 명을 선언한 후 Alt + Insert나 우클릭 > Gemerate로 Constructor과 Getter and Setter를 생성해준다.
private String title;
private String content;
private String time;
private String age;
메인 Activity
뷰, 어댑터, 데이터에 사용될 변수를 선언한다. 파일또한 어댑터와 데이터에 해당하는 java 파일을 만든다.
private RecyclerView view; //변수명은 주로 소문자 사용
private ItemAdapter itemAdapter;
private List<Item> datalist;
1. 리스트 데이터 생성
Oncreate 함수 내에서 datalist = new ArrayList로 타입을 명시해 객체를 생성한다.
만들어진 list에 datalist.add(new Item());으로 실제 데이터를 추가한다.
2. 데이터 → 어댑터(datalist) → 리사이클 뷰 (itemAdapter) 연결
어댑터는 데이터를 관리해주는 역활을 한다.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_board);
// 이걸하고나야 xml UI메모리에 올라가서,(inflate과정 이후에 ui컴포넌트를 java조작이 가능함)
// 리스트데이터 생성
datalist = new ArrayList<>();
datalist.add(new Item("Frozen","겨울","2:30","12"));
datalist.add(new Item("The witcher","coming soon","2:32","15"));
datalist.add(new Item("Game of Thrones","winter is coming","2:32","19"));
// 1. 어댑터 <- 데이터
itemAdapter = new ItemAdapter(datalist);
// 2. 리사이클뷰 <- 어댑터
view = findViewById(R.id.recyclerview);
view.setAdapter(itemAdapter);
view.setLayoutManager(new LinearLayoutManager(this));
}
}
itemAdapter.java
어댑터에는 세가지 메서드가 구현되어 있다.
- onCreateViewHolder : 뷰 홀더를 생성
- onBlindViewHolder : 데이터목록의 각 행의 항목을 셋팅하도록 구현
- getitemCount : 데이터 크기의 리턴
뷰 홀더는 화면에 나타내는 아이템 레이아웃만큼만 생성되며 이후 데이터는 만들어진 뷰 홀더를 재사용해 나타낸다.
package com.example.myapplication.board;
import ...
//(생략)
public class BoardAdapter extends RecyclerView.Adapter<BoardAdapter.BoardViewHolder> {
private List<Board> datas;
public BoardAdapter(List<Board> datas) {
this.datas = datas;
}
// LayoutInflater를 이용해서, 행UI를 생성하도록 구현
@Override
public BoardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new BoardViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.board_item, parent, false));
}
// 관리하는 데이터목록의 각 행의 항목을 셋팅하도록 구현
@Override
public void onBindViewHolder(@NonNull BoardViewHolder holder, int position) {
Board data = datas.get(position);
holder.title.setText(data.getTitle());
holder.contents.setText(data.getContents());
}
// 데이터의 크기 리턴
@Override
public int getItemCount() {
return datas.size();
}
// InnerClass로 RecyclerView.ViewHolder를 상속받는 클래스를 하나 만들어준다.
// 생성자에서 행UI에 있는 개별 Text, 이미지들을 연결시켜 둔다.
static class BoardViewHolder extends RecyclerView.ViewHolder {
private TextView title;
private TextView contents;
public BoardViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.item_board_title);
contents = itemView.findViewById(R.id.item_board_content);
}
}
}
- Inflate: xml에 표기된 레이아웃들을 메모리에 객체화시켜 사용할 수 있게 한다.
- position은 자동으로 생성되는 유사 인덱스 값이다.
- extends로 RecyclerView를 상속받으면 코드 작성 후 빨간 줄이 생성되는데 Alt + Enter로 Adapter에 필요한 세가지 메서드가 자동 생성된다.
item.java
아래와 같이 선언한 후 Generate로 getter and setter 생성과 constructer를 생성해준다.
package com.example.listview;
public class Item {
private String title;
private String content;
private String time;
private String age;
}
이후 실행을 확인한다.
> 개인적으로 발생한 에러
1. xml에 LinearLayout 에서 아이템들의 크기가 match_parent인 경우 화면에 꽉 차기때문에 다른 데이터나 레이아웃을 추가해도 보이지 않을 수 있다. 이럴 경우 wrap_content로 설정해주어야한다.
2, TextView를 EditText로 잘못 Activity에 입력했더니 앱이 켜지지 않았다.
3. 파일 이름을 계속 변경했을 시 manifests내에 패키지 이름도 변경해주어야하는데 경로를 전부 올바르게 입력한 후 com.부터 시작하는 이름으로 넣어줘야 에러가 안난다.
4. 변수 이름 생성에서 클래스 이름은 대문자, 변수 이름은 소문자로 생성을 하는데 한눈에 잘 알아볼 수 있게 입력해야하며 _ 남발도 좋지 않다. 통일성있게 id 값과 변수 값을 가져간다.
'개발 > Java' 카테고리의 다른 글
[Android 개발] Todo List 메인 화면 제작 스타일 적용 (0) | 2022.12.06 |
---|---|
[Android 개발] 안드로이드 RecyclerView(Adapter) 예제 코드 - Todo List 기본 틀 (0) | 2022.11.24 |
[Android 개발] RecyclerView(Adapter) 예제 코드 (0) | 2022.11.16 |
[Android 개발] 간단한 계산 기능 구현 (0) | 2022.11.13 |
[Java] Integer.paselnt()와 안드로이드 스튜디오 EditText 사용하기 (0) | 2022.11.12 |