RecyclerView는 여러개의 데이터를 목록으로 처리할때 사용한다.
우선 하나의 행에 대한 화면개발을 먼저 한다. (파일명 contact_row, LinearLayout로 파일 생성)
화면을 구성한다.
adapter 패키지를 만들고 안에 클래스를 만든다.
만든 클래스(ContactAdapter) 전체 코드
package com.dongsu.contacts.adapter;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import com.dongsu.contacts.MainActivity;
import com.dongsu.contacts.R;
import com.dongsu.contacts.UpdateActivity;
import com.dongsu.contacts.model.Contact;
import java.util.ArrayList;
// 2. RecyclerView.Adapter 상속한다.
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> {
// 3. 멤버변수와 생성자를 만든다.
Context context;
ArrayList<Contact> contactArrayList;
public ContactAdapter(Context context, ArrayList<Contact> contactArrayList) {
this.context = context;
this.contactArrayList = contactArrayList;
}
// 4. 오버라이딩 함수를 구현한다.
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.contact_row, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Contact contact = contactArrayList.get(position);
holder.txtName.setText(contact.name);
holder.txtPhone.setText(contact.phone);
holder.txtAddress.setText(contact.address);
}
@Override
public int getItemCount() {
return contactArrayList.size();
}
// 1. 메모리에 있는 데이터를 연결할 viewHolder를 만든다.
public class ViewHolder extends RecyclerView.ViewHolder {
TextView txtName;
TextView txtPhone;
TextView txtAddress;
ImageView imgDelete;
CardView cardView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
txtName = itemView.findViewById(R.id.txtName);
txtPhone = itemView.findViewById(R.id.txtPhone);
txtAddress = itemView.findViewById(R.id.txtAddress);
imgDelete = itemView.findViewById(R.id.imgDelete);
cardView = itemView.findViewById(R.id.cardView);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, UpdateActivity.class);
int index = getAdapterPosition();
Contact contact = contactArrayList.get(index);
intent.putExtra("index", index);
intent.putExtra("name", contact.name);
intent.putExtra("phone", contact.phone);
intent.putExtra("address", contact.address);
((MainActivity) context).launcher.launch(intent);
}
});
imgDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ShowAlertDialog();
}
});
}
private void ShowAlertDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(false);
builder.setTitle("주소록 삭제");
builder.setMessage("정말 삭제하시겠습니까?");
builder.setNegativeButton("No", null);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 몇번째 데이터를 선택했는지 알아야 한다.
int index = getAdapterPosition();
// 어레이리스트에서 삭제하고
contactArrayList.remove(index);
// 화면에 보여준다.
notifyDataSetChanged();
}
});
builder.show();
}
}
}
위 코드 작성 순서
// 1. 메모리에 있는 데이터를 연결할 ViewHolder를 만든다.
public class ViewHolder extends RecyclerView.ViewHolder {}
// 2. RecyclerView.Adapter<현재클래스명.ViewHolder> 상속한다.
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> {}
// 3. 멤버변수와 생성자를 만든다.
Context context;
ArrayList<Contact> contactArrayList;
public ContactAdapter(Context context, ArrayList<Contact> contactArrayList) {
this.context = context;
this.contactArrayList = contactArrayList;
}
// 4. 오버라이딩 함수를 구현한다.
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.contact_row, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Contact contact = contactArrayList.get(position);
holder.txtName.setText(contact.name);
holder.txtPhone.setText(contact.phone);
holder.txtAddress.setText(contact.address);
}
@Override
public int getItemCount() {
return contactArrayList.size();
}
위 코드 작성 후 리사이클러뷰를 구현할 메인 액티비티로 돌아와 화면에 연결하고 표시해주는 코드 작성한다.
메인 액티비티 코드
package com.dongsu.contacts;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.dongsu.contacts.adapter.ContactAdapter;
import com.dongsu.contacts.model.Contact;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Button btnAdd;
RecyclerView recyclerView;
ContactAdapter adapter;
ArrayList<Contact> contactArrayList = new ArrayList<>();
public ActivityResultLauncher<Intent> launcher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult o) {
if (o.getResultCode() == 200){
Contact contact = (Contact) o.getData().getSerializableExtra("contact");
contactArrayList.add(contact);
adapter.notifyDataSetChanged();
} else if (o.getResultCode() == 300) {
int index = o.getData().getIntExtra("index", -1);
Contact contact = (Contact) o.getData().getSerializableExtra("contact");
contactArrayList.set(index, contact);
adapter.notifyDataSetChanged();
}
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnAdd = findViewById(R.id.btnAdd);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddActivity.class);
launcher.launch(intent);
}
});
// 어뎁터 만들고 화면에 적용
adapter = new ContactAdapter(MainActivity.this, contactArrayList);
recyclerView.setAdapter(adapter);
}
}
'Android Studio' 카테고리의 다른 글
[Android Studio] RecyclerView에서 몇 번째 행을 눌렀는지 알 수 있는 어뎁터 함수 getAdapterPosition() (0) | 2023.12.28 |
---|---|
[Android Studio] RecyclerView Adapter에서 새로운 액티비티를 실행하는 방법 (0) | 2023.12.28 |
[Android Studio] 메뉴 아이콘을 벡터 이미지로 만드는 방법 (0) | 2023.12.27 |
[Android Studio] SharedPreferences (0) | 2023.12.27 |
[Android Studio] Activity 단방향 데이터, 양방향 데이터 전달하는 법 (1) | 2023.12.26 |