티스토리 뷰




문제점



RecyclerView 를 위한 

다음과 같은 Adapter 코드가 있다.


public class MyAdapter extends RecyclerView.Adapter<...> {

// ....

private int selectedPosition = -1;



@Override

public void onBindViewHolder(MyViewHolder holder, int position) {

holder.mTxvTest.setText(items.get(position));


if (selectedPosition == position)

holder.mTxvTest.setBackgroundColor(Color.RED);

else

holder.mTxvTest.setBackgroundColor(Color.TRANSPARENT);



holder.mTxvTest.setOnClickListener(new OnClickListener {

@Override

public void onClick(View v) {

selectedPosition = position;

notifyDataSetChanged();

}

});

}


// .....

}


위 코드는 선택된 아이템의 백그라운드 컬러를 변경해 주고, 

나머지 아이템들은 원래 색상으로 다시 돌려놓는 코드이다.


보통의 경우 이렇게 사용하면 큰 문제없이 선택 항목의 holder 를 컨트롤 할 수 있지만, 

holder 에 Components 들이 많아지면 질수록 

모든 항목을 갱신하는 notifyDataSetChanged(); 는 성능에 무리가 갈 수 있다.


나의 경우 실제로 42개의 셀로구현된 달력 (1 셀당 TextView 10개, ImageView 2개) 의 경우 

선택하고 나서 약간의 딜레이 후 Background Color 가 변경되었다.






검색


해당 문제의 해결을 위해 검색한 결과 대부분은

onBindViewHoler() 에서 onClick 을 만들지 말고, 

ViewHolder 의 생성자에서 만들라는 말이었다.


하지만, 내경우 어차피 어디서 만들던간에, 선택될 때마다 전체항목을 다시 갱신하는것은 똑같았고,

그렇게 바꿔도 여전히 약간의 딜레이가 생겼다 (조금은 빨라진듯한 감도 있었지만)






해결


문제의 해결은,

선택된 행의 배경색 변경과, 이전 선택 행의 배경색 원복으로 가닥을 잡고 해결했따.


위 코드에서 아래처럼 변경했다.




public class MyAdapter extends RecyclerView.Adapter<...> {

// ....

private int oldPosition = -1;

private int selectedPosition = -1;



@Override

public void onBindViewHolder(MyViewHolder holder, int position) {

holder.mTxvTest.setText(items.get(position));


if (selectedPosition == position)

holder.mTxvTest.setBackgroundColor(Color.RED);

else

holder.mTxvTest.setBackgroundColor(Color.TRANSPARENT);



holder.mTxvTest.setOnClickListener(new OnClickListener {

@Override

public void onClick(View v) {

oldPosition = selectedPosition;

selectedPosition = position;



//notifyDataSetChanged();

notifyItemChanged(oldPosition);

notifyItemChanged(selectedPosition);

}

});

}


// .....

}





공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함