티스토리 뷰
문제점
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);
}
});
}
// .....
}
'Computer > Android&iOS' 카테고리의 다른 글
(iOS/swift) missing return in a function expected to return '' (0) | 2018.11.19 |
---|---|
(Android) RecyclerView wrap_contents (0) | 2018.11.07 |
(Android) RecyclerView 다시 그릴때마다 간격이 벌어지는 현상 (0) | 2018.11.06 |
(Android) failed to instantiate one or more classes .. (0) | 2018.10.23 |
(Android) PNG 투명영역 미터치 처리 (0) | 2018.10.15 |
- Total
- Today
- Yesterday
- Node
- Phaser
- 노드
- mysql
- BBC 가쉽
- CentOS
- 서버
- 점유율
- php
- C언어
- 앵커브리핑
- xcode
- 리눅스
- 손석희
- 뉴스룸
- git hub
- linux
- Android
- 깃헙
- IOS
- Asterisk
- C
- nodejs
- Kotlin
- 배열
- GIT
- 안드로이드
- 스위프트
- node.js
- Swift
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |