안드로이드에서는 ListView나 롤리팝에 추가 된 RecyclerView의 화면 갱신을 위해서 어댑터의 notifyDataSetChanged() 메서드를 쓸 수 있다. 이 메서드는 데이터 셋의 정보 변경/구조 변경을 모두 감지하며, 메인 스레드에서 항목들을 업데이트 해준다.
그런데 실무를 하면서 headerview를 사용하는 경우 notifyDataSetChanged()를 호출 했을 때 포커스가 사라지는 문제가 있었다. 이유는 자명하다. headerview 역시 0번째 아이템 취급 되어 새로고침 되면서 포커스도 같이 사라진 것이다. RecyclerView의 경우 notifyItemChanged나 notifyItemInsertChanged같은 메서드를 잘못쓰면 Inconsistency 예외가 발생해 그대로 쓰기가 애매한 상황이었다.
삽질을 해본 결과 뷰가 새로고침 될 때, 0번 아이템에 강제로 포커스를 넣어주면 된다. getView()나 onBindViewHolder()에서 0번 아이템일때 포커스를 줄 뷰에 requestFocus를 호출하면 된다. 특히 EditText의 경우 setSelection으로 이전에 선택된 커서 위치를 다시 잡아주고 requestFocus를 실행하면 포커스가 사라지지 않는다.
// something... @Override public void onBindViewHolder(ViewHolder vh, int position) { if (position == 0) { if(!isFirstLoading){ final HeaderViewHolder viewHolder = (HeaderViewHolder) vh; viewHolder.searchText.setSelection(cursorPosition); viewHolder.searchText.requestFocus(View.FOCUS_DOWN); } } // .... }
답글 남기기