본문 바로가기
개발/Java

[Android 개발] 안드로이드 RecyclerView(Adapter) 예제 코드 설명

by m_.9m 2022. 11. 16.

전체적인 코드는 아래의 링크에 전문이 첨부되어있다.

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 값과 변수 값을 가져간다.