weeed
114
2020-05-27 13:42:22
3
598

리사이클러뷰어에서 스피너를 사용할 때 생기는 문제점에 대해서 질문드립니다


현재 리사이클러뷰에서 스피너와 텍스트뷰, 에디트 택스트 등의 인플레이터를 만들어서 복합적으로 사용하고 있습니다.

그 중 스피너가 문제가 됬는데요

리사이클러뷰 특성상 스피너가 안보이게 스크롤 하고 돌아오면 스피너가 초기화가 되는 현상입니다.

setOnItemSelectedListener을 사용해서 onItemSelected일 때 포지션값과 해당 String을 저장하여 스크롤하여 다시 초기화가 될 때 setSelection을 이용해서 저장한 포지션 값으로 셋팅하려고 했습니다.

하지만 setSelection이 실행될 때 (또는 setAdapter인데 구글링으로 찾아보는 중 setSelection일 때 라고 하더군요) OnItemSelected가 실행되면서 포지션이 0번값으로 돌아가 버립니다.

제가 무언가 놓치고 있는것이 있을까요?

밑은 제가 사용한 코드입니다.


ArrayAdapter spinnerAdapter = new ArrayAdapter(getApplicationContext(), R.layout.support_simple_spinner_dropdown_item, SpnTeam);
((spinnerViewHolder) holder).SprCont.setAdapter(spinnerAdapter);
((spinnerViewHolder) holder).SprCont.setSelection(TeamPosition, false);
Toast.makeText(getApplicationContext(), SelectItemTeam + TeamPosition, Toast.LENGTH_SHORT).show();
((spinnerViewHolder) holder).SprCont.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
SelectItemTeam = String.valueOf(teamInf.get(position).getWorkTeamName());
TeamPosition = position;
Toast.makeText(getApplicationContext(), SelectItemTeam + TeamPosition, Toast.LENGTH_SHORT).show();
}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
})
0
  • 답변 3

  • weeed
    114
    2020-05-27 15:15:01

    ++ 여러가지 테스트 중 해당 adapter가 화면 밖으로 나왔다가 다시 보이는 경우 다른 코드 보다 먼저 OnItemSelectedListener()가 호출된 후에 position 0으로 호출시켜주네요

  • CyanGlint
    1k
    2020-05-28 11:02:42

    RecyclerView로 개발할 때 실수하기 쉬운 부분인데

    리스트가 스크롤되어 화면 밖의 뷰를 그려줄 때 새로운 View Instance를 생성하지 않고

    기존에 만들어둔 ViewHolder에 onBindViewHolder()를 호출해서 값만 다시 설정 해 줍니다.


    만약 상태값등을 저장하는 변수를 onBindViewHolder() 내에서 초기화 하는 동작이 있으면

    한번 화면에 그려진 View가 스크롤되어 사라졌다가 다시 그려질 때

    기존에 세팅해준 값이 남아있는게 아니고 onBindViewHolder()가 호출되면서 

    초기화 동작을 다시 수행한다는 얘기죠


    이 코드의 경우에는 아마도 position을 보관하는 변수들이 

    onBindViewHolder() 내에서 선언되거나 초기화 되는 코드가 있을 것 같은데

    별도의 class에 담아서 list로 관리하시고 

    bind될 때 holder.adapterPosition으로 꺼내와서 매핑해주시는게 좋을 것 같네요

  • weeed
    114
    2020-05-28 18:40:02

    감사합니다!

    저도 ViewHolder는 처음에만 호출되고 유지되는 걸로 알고 있었는데 ViewHolder에 스피너를 생성해도 같은 현상이 일어나서 이상했습니다.

    결론을 말하면 스피너가 6개 있었는데 그 6개의 스피너에게 각각 ViewHolder를 생성하여 줬더니 문제가 해결됬습니다.

    다른 것들은 ViewHolder 하나로 여러 개 써도 문제가 없는데 이상하네요

    ViewHolder는 클래스이고, 사용할 때 객체로 받는데 왜 겹치는 현상이 일어나는지 궁금하네요

  • 로그인을 하시면 답변을 등록할 수 있습니다.