View
#오늘은?
금일은 Calendar를 개발하는 도중이기 때문에 간단히 해당 Calendar에서 사용하는 RecyclerView에 대해서 예제를 사용하면서 간단히 RecyclerView가 무엇인지 알아보자 추후에 Calendar 개발 하면 해당 Calendar에 대해서 포스트하겠당 현재..열심히 공부하면서 개발중...ㅠㅠ(답이 안나온다..ㅇㅅㅇ;)
RecyclerView
프로젝트 이름: RecyclerViewExample
안드로이드의 RecyclerView는 여러 리스트를 묶어서 뷰탄에 보여주는 역할을 합니다.
[정의]
사용자가 관리하는 많은 수의 데이터 집합을 개별 아이템 단위로 구성하여 화면에 출력하는 뷰그룹을 말합니다.
[구성요소]
Adapter: 아이템 뷰들을 생성하고 보여줄 뷰단에 연결하는 역할
Layout Manager: 아이템 뷰가 나열되는 형태의 관리하기 위한 요소
_ViewHoloder: 화면에 표시될 아이템 뷰를 저장하는 객체로 Adapter에 의해 관리되며, 미리 생성된 뷰홀더가 있을 경우 재활용됩니다.
RecycelerView의 가장 큰 특징은 이름에서도 알 수 있듯이 재사용아리는 것입니다. 이것은 뷰단에서 여러 리스트 요소를 가지고 일일이 표현하지 않고 RecyclerView 라는 뷰를 이용하여 묶어주므로써 재사용한다는 것을 의미합니다.
[XML]
RecyclerView를 생성
뷰단에서 RecyclerView의 모양을 만들어줍니다.
[코드]
RecyclerView 변수를 뷰단의 id와 연결
linearLayoutManager = new LinearLayoutManager(this); 를 이용한 레이아웃 메니저객체 생성
recyclerView.setLayoutManager(linearLayoutManager); 를 이용하여 RecyclerView에 아까 생성한 매니저를 설정
리스트들의 묶음이 될 ArrayList생성
mainAdapter의 생성자에 해당 위에 ArrayList를 넣어주므로써 mainAdapter 클래스에서 ArrayList형식으로 레이아웃을
RecyclerView 어댑터에 해당 세팅해서 묶어서 만든 mainAdapter를 setting해주므로써 끝나게 됩니다.
MainActivity
package com.example.recyclerviewexample;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ArrayList<MainData> arrayList;
private MainAdapter mainAdapter;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.rv); //뷰와 연결
linearLayoutManager = new LinearLayoutManager(this); //레이아웃 매니저 객체 생성
recyclerView.setLayoutManager(linearLayoutManager); //생성한 Recycler뷰에 위에 생성한 매니저 객체를 설정
arrayList = new ArrayList<>();
mainAdapter = new MainAdapter(arrayList);
recyclerView.setAdapter(mainAdapter);
Button btn_add = (Button)findViewById(R.id.btn_add);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainData mainData = new MainData(R.mipmap.ic_launcher, "제롱동이", "리사이클러뷰");
arrayList.add(mainData);
mainAdapter.notifyDataSetChanged();
}
});
}
}
MainAdapter는 RecyclerView의 한 묶음을 MainData 객체와 메소드를 이용하여 만들어주는 것입니다.
상단에 1번 있는 MainAdapter 클래스의 생성자 부분에서 ArrayayList를 생성자 매개 변수로 넣어줍니다.
2번은 OnclickLinear처럼 해당 어댑터부분에 OncreateView라고 보면 편할 것입니다.
해당 CustomViewHolder holder = new CustomViewHolder(view); 를 이용하여 한 묶음의 Holder 객체를 생성
3번은 MainData를 클래스를 이용하여 각각에 실질적 데이터 값을 한 묶음에 넣어줍니다.
즉 뷰단에서 묶어서 한가지 큰 리스트를 만든 것처럼 이것을 실제 데이터를 넣어서 연결해주는 것입니다.
4번은 해당 ArrayList의 길이값을 나타내어 나중에 필요할대 전제 즉 여러개의 Holder의 갯수를 나타낸다고 봐도 됩니다.
position은 각각의 Holder의 인덱스 번호라 보며 되면 각각의 Holder안에 있는 데이터의 경우 같은 position 즉 인덱스 값을 가지게 됩니다.
간단히 말하자면 0 이라는 인덱스를 가지는 Holder의 경우 Holder 안에 각각의 아이템인 profile, name, content가 모두 0 이라는 같은 인덱스 즉 position값을 가진다고 보면됩니다.
remove의 경우 해당 position의 값을 이용하여 특정 holder를 지우는 것입니다.
맨아래의 5번 CustomViewHolder는 어댑터의 뷰홀더 부분으로 뷰단의 각각의 아이템과 각각의 변수를 연결해줍니다.
MainAdapter
package com.example.recyclerviewexample;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.CustomViewHolder> {
private ArrayList<MainData> arrayList;
// 1번
public MainAdapter(ArrayList<MainData> arrayList) {
this.arrayList = arrayList;
}
// ---------------------------------------------------
//2번
@NonNull
@Override
public MainAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
CustomViewHolder holder = new CustomViewHolder(view);
return holder;
}
//-------------------------------------------------------------------
//3번
@Override
public void onBindViewHolder(@NonNull MainAdapter.CustomViewHolder holder, int position) {
holder.iv_profile.setImageResource(arrayList.get(position).getIv_profile());
holder.tv_name.setText(arrayList.get(position).getTv_name());
holder.tv_content.setText(arrayList.get(position).getTv_content());
holder.itemView.setTag(position);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String curName = holder.tv_name.getText().toString();
Toast.makeText(view.getContext(), curName, Toast.LENGTH_SHORT).show(); //해당 어댑터 클래스는 직접적으로 뷰랑 연결된 것이 아니기 때문에 뷰경로를 정해준다.(view.getContext())
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
remove(holder.getAdapterPosition());
return true;
}
});
}
//-----------------------------------------------------------------------------
//4번
@Override
public int getItemCount() {
return (null != arrayList ? arrayList.size() : 0);
}
public void remove(int position){
try {
arrayList.remove(position);
notifyItemRemoved(position); //어댑테에 내장 파일로 해당 기능은 데이터에 변경이 일어나면 F5해주는것이다.
}catch (IndexOutOfBoundsException ex){
ex.printStackTrace();
}
}
//---------------------------------------------------------------------------------
//5번
public class CustomViewHolder extends RecyclerView.ViewHolder {
protected ImageView iv_profile;
protected TextView tv_name;
protected TextView tv_content;
public CustomViewHolder(@NonNull View itemView) {
super(itemView);
this.iv_profile=(ImageView) itemView.findViewById(R.id.iv_profile);
this.tv_name=(TextView) itemView.findViewById(R.id.tv_name);
this.tv_content=(TextView) itemView.findViewById(R.id.tv_content);
}
}
}
MainData는 데이터 모델로써 해당 RecyclerView의 리스트 한묶음에 속해있는 아이템 값들의 데이터를 설정해주거나 해당 데이터를 가져올대 사용합니다.
MainData
package com.example.recyclerviewexample;
public class MainData {
private int iv_profile;
private String tv_name;
private String tv_content;
public MainData(int iv_profile, String tv_name, String tv_content) {
this.iv_profile = iv_profile;
this.tv_name = tv_name;
this.tv_content = tv_content;
}
public int getIv_profile() {
return iv_profile;
}
public void setIv_profile(int iv_profile) {
this.iv_profile = iv_profile;
}
public String getTv_name() {
return tv_name;
}
public void setTv_name(String tv_name) {
this.tv_name = tv_name;
}
public String getTv_content() {
return tv_content;
}
public void setTv_content(String tv_content) {
this.tv_content = tv_content;
}
}
[결과]
'TIL' 카테고리의 다른 글
문자열을 정수로 바꾸기(알고리즘) (0) | 2024.03.05 |
---|---|
코틀린 for문 사용 예제 (0) | 2024.03.04 |
앱 아이콘 설정하기 (0) | 2024.02.23 |
Rxjava 적용(4일째 고민...) (1) | 2024.02.19 |
이중 RecyclerView (0) | 2024.02.16 |