Java/AndroidStudio

Android - 리사이클러뷰 Context, getAdapterPosition, 데이터 수정

하니__ 2024. 6. 10. 11:24

 

 

 

 

카드뷰를 클릭 했을때 그 행을 수정하는 상황

 

리사이클러뷰 를 연락처를 담은 카드뷰로 만들고

여러개의 연락처 행들이 있는 상황에서

카드뷰 한개를 눌렀을때

 

 

우선 화면전환,

그리고 그 행의 정보를 가져와야 한다

 

cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent intent = new Intent(MainActivity.this, UpdateActivity.class);

 

그래서 이렇게 

intent를 사용해서 이동하려 하는데

context부분에서 MainActivity.this를 사용했었는데

에러가 나오게 된다

 

사용하는 부분이 메인액티비티가 아니면서

이 부분을 사용하고 있기에 막막하다

 

public ContactAdapter(Context context, ArrayList<Contact> contactArrayList) {
        this.context = context;
        this.contactArrayList = contactArrayList;
    }

하지만 이렇게 어댑터 객체 생성당시에

메인액티비티가 context로 들어갔기에

메인액티비티.this 대신 context로 사용하면 되겠다

 

그리고 다음문제

 

몇번째 행을 눌렀는지 알 수 있는 함수가 필요하다
int index = getAdapterPosition();
Contact contact = contactArrayList.get(index);

 

이 는

어댑터의 함수중

getAdapterPosition( )이라는 함수를 이용하여

인덱스의 번호를 알아낼수 있다

 

이를 인덱스라는 이름의 변수로 저장하여

 

어레이리스트의 .get(인덱스)로 가져와주자

 

 

 

 

 

결과물
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);
        intent.putExtra("index", index);
        ((MainActivity)context).launcher.launch(intent);
    }
});

 

 

최종적으로

 

컨텍스트로부터 가져와서

겟어댑터포지션으로 몇번째행인지 알아내어

다음 액티비티로 전해주고

다음액티비티에서 메인액티비티로 행의 정보를 다시 줘야하기때문에 인덱스의 정보도 주자

그리고 단방향 이동이 아닌 양방향 데이터 이동을 하는 액티비티 이동이기때문에

launcer.launch를 사용하는데

이때 context가 메인액티비티임을 확실히 알 수 있게 하기 위해

괄호를 이중으로 씌워주자

 

이제 수정으로 가자

 

크게 생각해서

데이터를 저장하는것과 다를것없다

 

달라지는 부분은

 

 

Contact contact = (Contact) getIntent().getSerializableExtra("contact");
index = (int) getIntent().getSerializableExtra("index");

앞에서 받아오는 데이터인

행의 정보와

인덱스의 정보를 받아주자

 

intent.putExtra("index",index);
setResult(1001, intent);

그리고 데이터를 저장할때와는 다르게

인덱스의 정보를 추가로 주고

ResultCode 또한 다른 번호로 주자

 

 

메인액티비티 수정
}else if (o.getResultCode() == 1001){
    Contact contact = (Contact) o.getData().getSerializableExtra("contact");
    int index = o.getData().getIntExtra("index",0);
    contactArrayList.set(index, contact);

    adapter.notifyDataSetChanged();

 

실행한 액티비티로부터 데이터를 받아오는 부분에

if 부분에서는 ResultCode가 1000번이었으니

else if로 1001로 지정해주고

 

index번호를 추가로 받아온다

그리고 이번엔 add가 아닌 set으로 수정을 정의 해주고

인덱스와 컨택트를 넣어주자