체크할 부분
1.리사이클러뷰에 어댑터에서, 새로운 액티비티를 실행하는 방법
2.리사이클러 뷰에서, 몇번째 행을 눌렀는지 알수 있는, 어댑터의 함수
a.getAdapterPostion()
3. 다른 액티비티로 데이터 전달 시, 클래스의 객체를 전달하는 방법
4. onResume 사용하기
문제)
기존 주소록앱에 변경 사항 발생
리사이클뷰의 카드를 눌렀을때
수정화면으로 이동구현
인텐트로 데이터를 넘겨줄 것인데
여긴 액티비티가 아니고 어댑터이므로
아래와 같이 어댑터 생성자부분에서 context 부분을 context 변수로 처리한다.
Intent intent = new Intent(context, EditActivity.class);
context 부분이 MainActivity.this로 되어있음을 확인
때문에 context 는 MainActivity.this로 된것이다.
인텐트로 데이터를 보낼때 직렬화 해서 한줄로 보냈으므로
받는부분에서 다시 복렬화 ? 를 해야한다
(Contact)로 객체화 한다.
onCreated는 한번만 실행되고 끝나지만.
페이지가 바뀔때 마다 onResume은 반드시 실행되므로
매번 실행시 표시할 내용은 여기에 작성한다.
전체코드
main액티비티
package com.leopard4.contactapp;
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.view.View;
import android.widget.Button;
import com.leopard4.contactapp.adapter.ContactAdapter;
import com.leopard4.contactapp.data.DatabaseHandler;
import com.leopard4.contactapp.model.Contact;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Button btnAdd;
// 리사이클러뷰를 사용할때!
// RecyclerView, Adapter, ArrayList(실제데이터) 를 셋트로 적어라!
RecyclerView recyclerView;
ContactAdapter adapter;
ArrayList<Contact> contactList;
@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(this));
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, AddActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onResume() {
// DB에서 데이터를 가져와서, 리사이클러뷰에 뿌려준다.
DatabaseHandler db = new DatabaseHandler(MainActivity.this);
contactList = db.getAllContacts();
db.close();
// 어댑터를 생성하고,
adapter = new ContactAdapter(MainActivity.this, contactList);
// 리사이클러뷰에 셋팅
recyclerView.setAdapter(adapter);
super.onResume();
}
}
edit액티비티
package com.leopard4.contactapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import com.leopard4.contactapp.model.Contact;
public class EditActivity extends AppCompatActivity {
EditText editName;
EditText editPhone;
Button btnSave;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
editName = findViewById(R.id.editName);
editPhone = findViewById(R.id.editPhone);
btnSave = findViewById(R.id.btnSave);
// 아래 코드는 학예회 수준의 코드고
// int id = getIntent().getIntExtra("id", 0);
// String name = getIntent().getStringExtra("name");
// String phone = getIntent().getStringExtra("phone");
// editName.setText(name);
// editPhone.setText(phone);
// Contact 객체를 직렬화해서 보내면, 받는 쪽에서도 Contact 객체로 받을 수 있다.
// 받은걸 다시 Contact 객체로 변환해서 사용하면 된다. 이것이 실무
Contact contact = (Contact) getIntent().getSerializableExtra("contact");
editName.setText(contact.getName());
editPhone.setText(contact.getPhone());
}
}
add액티비티
package com.leopard4.contactapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.leopard4.contactapp.data.DatabaseHandler;
import com.leopard4.contactapp.model.Contact;
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 view) {
String name = editName.getText().toString().trim();
String phone = editPhone.getText().toString().trim();
// 이름과 전화번호가 모두 있어야 한다!
if (name.isEmpty() || phone.isEmpty()) {
Toast.makeText(AddActivity.this, "이름과 전화번호를 모두 입력해주세요", Toast.LENGTH_SHORT).show();
return;
}
// 묶어서 처리할 Contact 클래스를 하나 만든다.
Contact contact = new Contact(name, phone);
// DB에 저장한다.
DatabaseHandler db = new DatabaseHandler(AddActivity.this);
db.addContact(contact);
// 유저한테 잘 저장되었다고, 알려주고
Toast.makeText(AddActivity.this, "저장되었습니다", Toast.LENGTH_SHORT).show();
// 액티비티 종료
finish();
}
});
}
}
model패키지의 Contact 클래스
package com.leopard4.contactapp.model;
import java.io.Serializable;
public class Contact implements Serializable { // Serializable 인터페이스를 구현해야, 객체를 직렬화할 수 있다.
public int id;
public String name;
public String phone;
public Contact() {
}
public Contact(String name, String phone) {
this.name = name;
this.phone = phone;
}
public Contact(int id, String name, String phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
adapter 패키지의 ContactAdapter (어댑터라서 클래스와는 구분하는듯)
package com.leopard4.contactapp.adapter;
// 1. RecyclerView.Adapter 를 상속받는다.
// 2. 상속받은 클래스가 abstract 이므로, unimplemented method 오버라이드!
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.leopard4.contactapp.EditActivity;
import com.leopard4.contactapp.R;
import com.leopard4.contactapp.model.Contact;
import java.util.List;
// 6. RecyclerView.Adapter 의 데이터 타입(<ContactAdapter.viewHolder>)을 적어주어야 한다.
// 우리가 만든 ViewHolder 로 적는다.
// 7. 빨간색 에러가 뜨면, 우리가만든 ViewHolder 로,
// onCreateViewHolder, onBindViewHolder 함수도 변경해준다.
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.viewHolder> {
// 5. 어댑터 클래스의 멤버변수와 생성자를 만들어 준다.
Context context; // 어떤 액티비티에서 실행할건데 라는것
List<Contact> contactList;
public ContactAdapter(Context context, List<Contact> contactList) {
this.context = context;
this.contactList = contactList;
}
// 8. 오버라이드 함수 3개를 전부 구현해 주면 끝!
@NonNull
@Override
public ContactAdapter.viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// xml 파일을 연결하는 작업
// 재사용 가능한 코드이므로 리턴클래스명, 파일명만 바꿔주자. (contact_row)
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.contact_row, parent, false);
return new ContactAdapter.viewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ContactAdapter.viewHolder holder, int position) {
// 뷰에 데이터를 셋팅한다!
// 파라미터 holder = 행 하나하나를 의미한다. position = 몇번째 행인지를 의미한다.
Contact contact = contactList.get(position);
holder.txtName.setText( contact.name );
holder.txtPhone.setText( contact.phone );
}
@Override
public int getItemCount() {
// 전체 데이터의 갯수를 적어준다.
return contactList.size();
}
// 3. ViewHolder 클래스를 만든다.
// 이 클래스는 row.xml 화면에 있는 뷰를 연결시키는 클래스다.
// ViewHolder 클래스는 RecyclerView.ViewHolder 를 상속받는다.
public class viewHolder extends RecyclerView.ViewHolder {
TextView txtName, txtPhone;
ImageView imgDelete;
CardView cardView;
// 4. 생성자를 만든다.
// 생성자에서, 뷰를 연결시키는 코드를 작성하고,
// 클릭 이벤트도 작성한다.
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(R.id.cardView);
// 9. 클릭 이벤트를 만들어 준다.
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1) 인텐트에 유저가 어떤 행을 눌렀는지 파악하여
// 누른 이름과 전화번호를 담아서
int index = getAdapterPosition(); // 어떤 행을 눌렀는지 인덱스로 알려준다.
Contact contact = contactList.get(index); // 해당 행의 데이터를 가져온다.
// 2) 수정 액티비티를 띄운다.
// 어떤 액티비티가 어떤 액티비티를 띄운다!! => 인텐트에 있어야 한다.
Intent intent = new Intent(context, EditActivity.class);
// intent.putExtra("id", contact.id);
// intent.putExtra("name", contact.name);
// intent.putExtra("phone", contact.phone);
// 위와같이 하면 귀찮으니까 Contact를 직렬화해서 한번에 넘겨준다
// 직렬화는 Contact 클래스에 Serializable을 implements 해줘야 한다.
intent.putExtra("contact", contact);
context.startActivity(intent);
}
});
}
}
}
'Android' 카테고리의 다른 글
Android 네트워크 통신 (0) | 2023.02.03 |
---|---|
Android [메모앱/서치/리사이클] maxline, ellipsize, addTextChangedListener, github 올리기 (0) | 2023.02.03 |
Android [메모앱] recyclerView (0) | 2023.02.01 |
Android recyclerView, adapter (2) | 2023.02.01 |
Android SQLite3 , RecyclerView , SQLiteOpenHelper 클래스를 상속 , 메뉴 아이콘 이미지를 벡터 이미지로 만드는 방법, CardView 예시 (1) | 2023.01.31 |