이번 시간에는 리스트에 있는 사용자를
선택하면 수정 화면으로 이동하여 사용자
정보를 변경하는 방법을 알아보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.05.16 - [안드로이드] - [안드로이드] Database Room 사용법 part3 - 리스트
- 설명 -
액티비티 중복 생성 방지
android:launchMode="singleTask"
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTask"
>
app 선택 -> 마우스 오른쪽 클릭 -> New -> Activity -> Empty Activity
액티비티 이름: UpdateActivity
- 설명 -
1. 리스트에서 선택한 데이터를 EditText에 보여준다.
2. 사용자 정보를 수정하고 Button을 누르면 수정된다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".UpdateActivity">
<EditText
android:id="@+id/up_name_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="이름"
android:inputType="text" />
<EditText
android:id="@+id/up_age_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/up_name_edit"
android:hint="나이"
android:inputType="number" />
<Button
android:id="@+id/update_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/up_age_edit"
android:layout_centerHorizontal="true"
android:text="수정" />
</RelativeLayout>
- 설명 -
1. 아이템 어뎁터에서 넘어온 데이터를 변수에 담아 화면에 보여준다.
2. 입력한 데이터를 변수에 담아 DB를 통해 수정한다.
public class UpdateActivity extends AppCompatActivity {
EditText upNameEdit, upAgeEdit;
int uId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update);
//초기화
upNameEdit = findViewById(R.id.up_name_edit);
upAgeEdit = findViewById(R.id.up_age_edit);
Button updateBtn = findViewById(R.id.update_btn);
//아이템 어뎁터에서 넘어온 데이터 변수에 담기
String name = getIntent().getStringExtra("userName");
String age = getIntent().getStringExtra("userAge");
uId = getIntent().getIntExtra("uId", 0);
//변수 화면에 보여주기
upNameEdit.setText(name);
upAgeEdit.setText(age);
//수정버튼 이벤트
updateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//입력값 변수에 담기
String userName = upNameEdit.getText().toString();
String userAge = upAgeEdit.getText().toString();
//사용자 클래스 생성
User user = new User();
user.uid = uId;
user.userName = userName;
user.userAge = userAge;
//DB생성
AppDatabase db = AppDatabase.getDBInstance(UpdateActivity.this);
//데이터 수정
db.userDao().userUpdate(user);
//메인 화면으로 이동
Intent intent = new Intent(UpdateActivity.this, MainActivity.class);
startActivity(intent);
//UpdateActivity 액티비티 종료
finish();
}
});
}
}
- 추가 -
수정화면(UpdateActivity)를 호출하기 위해 필요한 변수를 추가
Context context;
public UserAdapter(Context context) {
this.context = context;
}
- 추가
1. mPosition 위치 변수 추가
2. holder.itemView.setOnClickListener
클릭 이벤트 추가
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
int mPosition = holder.getAdapterPosition();
holder.nameText.setText(userList.get(mPosition).userName);
holder.ageText.setText(userList.get(mPosition).userAge);
//수정화면으로 이동
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, UpdateActivity.class);
intent.putExtra("uId", userList.get(mPosition).uid);
intent.putExtra("userName", userList.get(mPosition).userName);
intent.putExtra("userAge", userList.get(mPosition).userAge);
context.startActivity(intent);
}
});
}
- 추가 -
notifyDataSetChanged();
데이터셋 변경하는 코드 추가
public void setUserList(List<User> userList){
this.userList = userList;
notifyDataSetChanged();
}
- 전체 코드 -
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.MyViewHolder>{
List<User> userList;
Context context;
public UserAdapter(Context context) {
this.context = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.list_item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
int mPosition = holder.getAdapterPosition();
holder.nameText.setText(userList.get(mPosition).userName);
holder.ageText.setText(userList.get(mPosition).userAge);
//수정화면으로 이동
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, UpdateActivity.class);
intent.putExtra("uId", userList.get(mPosition).uid);
intent.putExtra("userName", userList.get(mPosition).userName);
intent.putExtra("userAge", userList.get(mPosition).userAge);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return this.userList.size();
}
//리스트 저장
public void setUserList(List<User> userList){
this.userList = userList;
notifyDataSetChanged();
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView nameText, ageText;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
nameText = itemView.findViewById(R.id.name_text);
ageText = itemView.findViewById(R.id.age_text);
}
}
}
- 추가 -
수정화면에서 메인화면 호출 시 실행
액티비티 중복 생성 방지하는 코드를
추가했기 때문에 OnCreate대신 실행된다.
//액티비티 백그라운드에 있는데 호출되면 실행됨
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//사용자 조회
loadUserList();
}
- 추가 -
사용자어뎁터 생성자에 메인 액티비티를 넘겨준다.
//UserAdapter 초기화
adapter = new UserAdapter(MainActivity.this);
- 전체 코드 -
public class MainActivity extends AppCompatActivity {
UserAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FloatingActionButton fab = findViewById(R.id.insertBtn);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, InsertUserActivity.class);
activityResult.launch(intent);
}
});
//RecyclerView 초기화 및 설정
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//UserAdapter 초기화
adapter = new UserAdapter(MainActivity.this);
//RecyclerView Adapter 설정
recyclerView.setAdapter(adapter);
//사용자 조회
loadUserList();
}
//액티비티 백그라운드에 있는데 호출되면 실행
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//사용자 조회
loadUserList();
}
ActivityResultLauncher<Intent> activityResult = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(result.getResultCode() == RESULT_OK){
//사용자 조회
loadUserList();
}
}
}
);
//사용자 조회
private void loadUserList() {
AppDatabase db = AppDatabase.getDBInstance(this.getApplicationContext());
List<User> userList = db.userDao().getAllUser();
//리스트 저장
adapter.setUserList(userList);
}
}
2022.05.07 - [안드로이드] - [안드로이드] HTTP 통신 Volley 사용법 part1 - 간단한 요청 및 응답
2022.04.19 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part1 화면 구성
2022.03.09 - [안드로이드] - [안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part1
[안드로이드 코틀린] 변수 생성 및 변수 타입 만드는 방법 (0) | 2022.05.19 |
---|---|
[안드로이드] Database Room 사용법 part5 - 삭제 (0) | 2022.05.18 |
[안드로이드] Database Room 사용법 part3 - 리스트 (0) | 2022.05.16 |
[안드로이드] Database Room 사용법 part2 - 데이터 등록 (0) | 2022.05.15 |
[안드로이드] Database Room 사용법 part1 - Room 설정 (1) | 2022.05.14 |
댓글 영역