RecyclerView 기본 사용법

2018. 11. 25. 12:41Coding/Android Studio

728x90

0. 기본적인 UserItem.class와 item_user.xml 생성

public class UserItem {

int userId;
int id;
String title;
String body;

public UserItem(int userId, int id, String title, String body) {
this.userId = userId;
this.id = id;
this.title = title;
this.body = body;
}

public int getUserId() {
return userId;
}

public void setUserId(int userId) {
this.userId = userId;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getBody() {
return body;
}

public void setBody(String body) {
this.body = body;
}
}

입력받을 데이터 타입에 맞게 변수 선언

ctrl+enter눌러서(mac기준...), Getter and Setter와 Consturctor를 이용해서 생성



item_user.xml은 필요한 형태로 디자인...




1.사용준비

https://developer.android.com/guide/topics/ui/layout/recyclerview 접속


Add support library에 나온대로, gradle에 등록 - sync now

dependencies {
    implementation
'com.android.support:recyclerview-v7:28.0.0'
}



2.RecyclerView 생성

Layout XML파일 

<android.support.v7.widget.RecyclerView
android:id="@+id/rv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>


사용할 화면에(여기서는 MainActivity) RecyclerView 생성

RecyclerView rv_list = findViewById(R.id.rv_list);



3.ViewHolder 생성

public class UserViewHolder {

}


RecyclerView.ViewHolder 상속

public class UserViewHolder extends RecyclerView.ViewHolder {

//외부 접근이 용의하게 public으로 선언
public TextView tvUserId, tvId, tvTitle, tvBody;

//itemView가 리스트의 item인 item_user.xml을 불러옴.
public UserViewHolder(@NonNull View itemView) {
super(itemView);
// R에서 에러나면 하라는대로 R을 추가해주면된다.
// alt+enter로 추가했다.
tvUserId = itemView.findViewById(R.id.tv_userId);
tvId = itemView.findViewById(R.id.tv_id);
tvTitle = itemView.findViewById(R.id.tv_title);
tvBody = itemView.findViewById(R.id.tv_body);
}
}

상속 후 에러 메시지 뜨면 시키는대로 생성자 만들어줌.

item_user.xml에 디자인한대로 필요한 TextView나 ImageView등을 선언

주석 처럼 R에서 에러가 뜨면 [import com.example.yoonho.recyclerviewapp.R;]  alt+enter를 활용해서 이런식으로 추가를 시킨다.




4-0. Adapter<VH> 생성

public class UserAdapter extends RecyclerView.Adapter<UserViewHolder> {
@NonNull
@Override
// 뷰홀더 생성
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return null;
}

@Override
// 뷰홀더를 리스트와 연결
public void onBindViewHolder(@NonNull UserViewHolder userViewHolder, int i) {

}

@Override
// 아이템 개수
public int getItemCount() {
return 0;
}
}

UserAdapter 클래스 생성.

RecyclerVIew.Adapter<VH> 상속.

<VH> 에 이전에 만든 UserViewHolder 넣음.

에러 뜨면 alt+enter로 필수적인 메소드 [onCreateViewHolder], [onBindViewHolder], [getItemCount]생성




4-1. onCreateViewHolder

private Context mContext;

public UserAdapter(Context mContext) {
this.mContext = mContext;
}

@NonNull
@Override
// 뷰홀더 생성
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View baseView = View.inflate(mContext, R.layout.item_user, null);
UserViewHolder userViewHolder = new UserViewHolder(baseView);
return userViewHolder;
}

UserViewHolder타입의 onCreateViewHolder이므로 UserViewHolder타입을 return해줘야한다.

return 해줄 UserViewHolder를 생성하면, View가 필요하다고한다.

View를 생성해서 inflate를 하면, 이번엔 Context가 필요하다고한다.

Context를 가져오려면 생성자를 통해 받아와야 하므로, Context를 선언하고, 생성자를 만들어서 받아오는 작업을 한다.


다시, 만들던 View의 작업을 마무리하고, R에서 에러가 뜨면 이전처럼 alt+enter 눌러서  [import com.example.yoonho.recyclerviewapp.R;] 이런식으로 해결

UserViewHolder()에 baseView를 넣고, return에 null대신 userViewHolder를 넣어준다.



4-2. Adapter생성

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

RecyclerView rv_list = findViewById(R.id.rv_list);

ArrayList<UserItem> listItem = new ArrayList<>();

        
//더미 데이터

for(int i=0; i<30; i++) {
UserItem item = new UserItem(
1,
1,
"sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto"
);
listItem.add(i,item);
}

UserAdapter adapter = new UserAdapter(this, listItem);
}
}

먼저, 리스트에 추가할 데이터리스트를 가지고 있는 ArrayList<UserItem>을 만들어준다.

UserAdapter생성

앞서 context가 필요해서 만든 생성자로 인해, UserAdapter(this)가 들어간다. 하지만, 리스트에 넣을 데이터도 보내야 하므로 (this, listItem)을 추가한다.

에러가 나면, alt+enter로 바로 UserAdapter.class의 생성자에  ArrayList<UserItem> listItem  을 추가시킨다.

앞서 UserAdapter에서 context를 추가한것처럼,  private ArrayList<UserItem> userItems;  을 만들고, 생성자 안에도  this.userItems = listItem;  을 해준다.




4-3 getCount

@Override
// 아이템 개수
public int getItemCount() {
return userItems.size();
}

위의 4-2에서 ArrayList로 userItems를 가져왔으니, 데이터 전체의 개수를 알 수 있다.



4-4 onBindViewHolder

@Override
// 뷰홀더를 리스트와 연결
public void onBindViewHolder(@NonNull UserViewHolder userViewHolder, int position) {

UserItem item = userItems.get(position);
userViewHolder.tvUserId.setText(""+item.getUserId());
userViewHolder.tvId.setText(""+item.getId());
userViewHolder.tvTitle.setText(item.getTitle());
userViewHolder.tvBody.setText(item.getBody());
}

편의를 위해서 onBindViewHolder의 인자 int i => int position으로 변경

데이터들이 담겨있는 userItems를 인덱스 번호를 나타내는 position값으로 가져와서 UserItem타입의 변수인 item에 넣어준다.

이제, 해당 인덱스의 값은 item에 담겨 있으므로, 필요한 값을 꺼내서, 디자인한 item_user.xml에 맞게 집어 넣는다.




5. RecyclerVier와 Adapter연결

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

RecyclerView rv_list = findViewById(R.id.rv_list);

ArrayList<UserItem> listItem = new ArrayList<>();

//더미 데이터
for(int i=0; i<30; i++) {
UserItem item = new UserItem(
1,
1,
"sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto"
);
listItem.add(i,item);
}

UserAdapter adapter = new UserAdapter(this, listItem);
rv_list.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
rv_list.setAdapter(adapter);
}

추가된건 마지막 두 줄 뿐이다.

setLayoutManager을 통해서 리스트의 형태를 정해주고,

setAdapter로 리스트와 어댑터를 연결한다.


setLayoutManager는 아래와 같은 배열이 가능하다.

LinearLayoutManager - Vertical        세로

Horizontal    가로

GridLayoutManager                            바둑판

StaggeredGridLayoutManager            사이즈별로 능동적으로 바둑판







728x90