안드로이드 스튜디오
[ 안드로이드 ] 어댑터(Adapter) 란? 어댑터 사용법
zzuvely
2022. 7. 15. 17:06
어댑터(Adapter)란 ?
데이터를 올리는 부분에서 뷰와 뷰에 올릴 데이터를 연결해주는 것이다.
데이터를 받아서 관리하고 어댑터 뷰에 출력할 수 있는 형태로 데이터를 제공하는 객체
어댑터 뷰(Adapter View) 란 ?
많은 정보를 효과적으로 처리하기 위해 View에 직접 정보를 주입하지 않고, Adapter라는 중간 매개체를 이용한다.
ex) ListView, GridView, Spinner, Gallery, RecycleView 등
어댑터 사용법
1. 레이아웃 만들기
1) Adapter View로 사용할 RecyclerView를 정의해준다.
<!-- activity_main.xml -->
<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/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2) 어떤 데이터를 어댑터에서 이용할 지 정해야 하므로 데이터 양식을 만들어 준다.
<!-- contact_row.xml -->
<LinearLayout 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="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="5dp"
app:cardCornerRadius="5dp"
app:cardElevation="5dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:orientation="vertical">
<TextView
android:id="@+id/txtName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="15dp"
android:text="이름"
android:textSize="26sp" />
<TextView
android:id="@+id/txtPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="20dp"
android:text="전화번호"
android:textSize="26sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
2. 어댑터 만들기
1) RecyclerView.Adapter를 상속 받는다.
public class MyAdapter extends RecyclerView.Adapter {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
2) contact_row.xml 화면에 있는 뷰를 연결시키는 ViewHolder 클래스를 만든다.
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
}
3) 생성자 안에, 연결시키는 코드를 작성한다.
public class ViewHolder extends RecyclerView.ViewHolder {
TextView txtName;
TextView txtPhone;
CardView cardView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
txtName = itemView.findViewById(R.id.txtName);
txtPhone = itemView.findViewById(R.id.txtPhone);
cardView = itemView.findViewById(R.id.cardView);
}
}
4) 어댑터 클래스의 멤버변수와 생성자를 만들어 준다.
public class MyAdapter extends RecyclerView.Adapter {
Context context;
List<Contact> contactList;
public MyAdapter(Context context, List<Contact> contactList) {
this.context = context;
this.contactList = contactList;
}
...
5) RecyclerView.Adapter의 데이터 타입을 앞에서 만든 ViewHolder의 타입으로 설정
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
...
@NonNull
@Override
public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
}
...
6) 함수들을 구현
...
@NonNull
@Override
public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_row, parent, false);
return new MyAdapter.ViewHolder(view);
}
// 메모리에 있는 데이터(리스트) 를 화면에 표시하는 함수.
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Contact contact = contactList.get(position);
holder.txtName.setText(contact.name);
holder.txtPhone.setText(contact.phone);
}
@Override
public int getItemCount() {
return contactList.size();
}
...
3. MainActivity.java
DB에서 데이터를 가져와서 RecyclerView에 표시한다.
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
ContactAdapter adapter;
ArrayList<Contact> contactList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseHandler db = new DatabaseHandler(MainActivity.this);
contactList = db.getAllContacts();
adapter = new ContactAdapter(MainActivity.this, contactList);
recyclerView.setAdapter(adapter);
db.close();
...