안드로이드 스튜디오

[ 안드로이드 ] 어댑터(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();

	...