어뎁터 코드
package com.example.simplecontacts.adapter;
import static com.example.simplecontacts.R.*;
import android.content.Context;
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.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import com.example.simplecontacts.MainActivity;
import com.example.simplecontacts.R;
import com.example.simplecontacts.UpdateActivity;
import com.example.simplecontacts.model.Contact;
import java.util.ArrayList;
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder>{
// 4. 어댑터 클래스의 멤버 변수 만든다.
// 컨텍스트는 어떤 액티비티에서 리스트를 보여줄지 알아야 하기 때문에 필요.
Context context;
// 리사이클러뷰는 여러 개의 데이터를 리스트로 보여주는 것이니까 필요하다.
ArrayList<Contact> contactArrayList;
// 5. 생성자를 만들어준다.
public ContactAdapter(Context context, ArrayList<Contact> contactArrayList) {
this.context = context;
this.contactArrayList = contactArrayList;
}
// 6. 아래 3개의 함수를 구현한다.
// 화면과 뷰홀더를 연결시킨다.
@NonNull
@Override
public ContactAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(layout.contact_row, parent, false);
return new ContactAdapter.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);
}
// 데이터의 갯수를 나타낸다.
@Override
public int getItemCount() {
return contactArrayList.size();
}
// 1. 뷰 홀더 클래스를 만든다.
public class ViewHolder extends RecyclerView.ViewHolder{
TextView txtName;
TextView txtPhone;
ImageView imgDelete;
CardView cardView;
public ViewHolder(@NonNull View itemView){
super(itemView);
txtName=itemView.findViewById(R.id.txtName);
txtPhone=itemView.findViewById(R.id.txtPhone);
imgDelete=itemView.findViewById(R.id.imgDelete);
cardView=itemView.findViewById(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("contact",contact);
context.startActivity(intent);
}
});
}
}
}
메인엑티비티 코드
package com.example.simplecontacts;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import androidx.activity.EdgeToEdge;
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.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.simplecontacts.adapter.ContactAdapter;
import com.example.simplecontacts.model.Contact;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Button btnAdd;
// 리사이클러뷰는 항상 같이 사용하는 멤버변수들이 있다.
RecyclerView recyclerView;
// 첫번쨰로, 여러 데이터를 처리해야 하니까, 어레이 리스트가 있어야 한다.
ArrayList<Contact> contactArrayList = new ArrayList<>();
// 두번쨰로, 메모리의 데이터를 화면에 보이게 하는 어댑터가 있어야 한다.
ContactAdapter adapter;
// Addactivity 로 부터 데이터를 받아야 하므로 엑티비티 리절트 런처를 만든다.
ActivityResultLauncher<Intent> launcher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult o) {
// 내가 실행한 액티비티로 부터 , 데이터를 받아오는 부분
if ( o.getResultCode() == 1000){
Contact contact= (Contact) o.getData().getSerializableExtra("contact");
contactArrayList.add(contact);
// 메모리의 데이터가 바뀌면
// 리사이클러뷰의 화면에도 데이터를 표시하도록
// 어댑터의 함수를 이용해야 한다,
adapter.notifyDataSetChanged();
Log.i("CoNTACT MAIN",contact.name + "" +contact.phone);
}
}
});
@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);
}
}
정보 보내는 add엑티비티 코드
package com.example.simplecontacts;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.example.simplecontacts.model.Contact;
import com.google.android.material.snackbar.Snackbar;
public class AddActivity extends AppCompatActivity {
EditText editName;
EditText editPhone;
Button btnSave;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
editName = findViewById(R.id.editName);
editPhone = findViewById(R.id.editPhone);
btnSave = findViewById(R.id.btnSave);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String Name = editName.getText().toString().trim();
String Phone = editPhone.getText().toString().trim();
if (Name.isEmpty() || Phone.isEmpty()) {
Snackbar.make(btnSave, "비어있음", Snackbar.LENGTH_SHORT).show();
return;
}
Contact contact =new Contact(Name,Phone);
// 현제 나를 실행시킨 엑티비티에 데이터를 돌려주는 코드
Intent intent = new Intent();
intent.putExtra("contact",contact);
setResult(1000,intent);
finish();
}
});
}
}
수정하는 액티비티 코드
package com.example.simplecontacts;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.example.simplecontacts.model.Contact;
public class UpdateActivity extends AppCompatActivity {
EditText editName;
EditText editPhone;
Button btnSave;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update); // 레이아웃 파일 설정
// q받아오는 데이터가 있다.
Contact contact = (Contact) getIntent().getSerializableExtra("contact");
// EditText와 Button 초기화
editName = findViewById(R.id.editName);
editPhone = findViewById(R.id.editPhone);
btnSave = findViewById(R.id.btnSave);
// 받아온 연락처 정보를 EditText에 설정
editName.setText(contact.name);
editPhone.setText(contact.phone);
}
}
'Aandroid Studio > 기능' 카테고리의 다른 글
[android] actionbar menu ,뒤로가기 버튼 생성 (0) | 2024.06.11 |
---|---|
[android]AlertDialog 예, 아니오 선택창 (0) | 2024.06.10 |
[android] SharedPreferences 를 이용한, 데이터 저장과 불러오기 (0) | 2024.06.07 |
[android] 액티비티간, 단방향 전달, 백버튼 누를때 전달 방법 (0) | 2024.06.07 |
[android] Toast, Snackbar, AlerDialog 팝업창 띄우는 방법 (0) | 2024.06.05 |