RecyclerView ScrollBar(Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollVertically()' on a null object reference)
RecyclerView ScrollBar 에러
(Attempt to invoke virtual method
'boolean android.support.v7.widget.RecyclerView$
LayoutManager.canScrollVertically()' on a null object reference)
RecyclerView를 사용할때 기본적으로
ScrollBar가 표시되지 않는다.
ScrollBar를 표시하기 위해서는 xml에서
android:scrollbars="vertical"를 넣어주면 된다.
하지만 어떠한 상황에서는
아래와 같은 에러메시지를 볼 수 있다.
이 에러는 RecyclerView를
Adapter와 연결하지 않았을때 발생하는것 같다.
보통 RecyclerView를 사용할때는
LinearLayoutManager와 Adapter, Recyclerview셋팅을
onCreate에서 아래와 같은 식으로 한다.
RecyclerView rv = (RecyclerView)findViewById(R.id.rv);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setOrientation(LinearLayoutManager.VERTICAL);
rv.setLayoutManager(llm);
rv.setAdapter(new CustomAdapter());
Fragment에서는 onCreateView에서 할 것이다.
그런데 데이터를 동적으로 받을때
Adapter를 onCreateView가 아닌
setUserVisibleHint에서 연결해야 되는 경우
경우가 있다.
그래서 onCreateView가 아닌
setUserVisible에서 rv.setAdapter();를 하게 되면
위 사진과 같은 에러를 띄우며
앱이 죽는다.
해결방법
처음에는 대충대충
이것저것 넣어가보며
해결해보려고 했지만..
역시 해결되지 않았다.
그래서 천천히 Log를 찍어가면서
찾아보니 해결할 수 있었다.
이 해결방법은
Fragment라고 가정
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
RelativeLayout layout = (RelativeLayout) inflater.inflate(R.layout.rl, container, false);
RecyclerView rv = (RecyclerView)layout.findViewById(R.id.rv);
...
rv.setAdapter(new CustomAdapter(null));
return layout;
}
해결방법은 간단하게
onCreateView에서 setAdapter를
해주면 된다.
물론 데이터는 setUserVisible~
에서 받아서 뿌려줘야 하지만
일단은 빈 Adapter라도
RecyclerView와 연결하면
해결할 수 있다.
그리고 다시
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
{
customAdapter = new CustomAdapter(....);
rv.setAdapter(customAdapter);
setUserVisibleHint에서
Adapter를 초기화 한 후에
RecyclerView와 연결하면
해결된다.
'안드로이드 에러 > RuntimeException' 카테고리의 다른 글
MediaRecorder(java.lang.RuntimeException: stop failed.) (0) | 2016.12.31 |
---|---|
Custom View 호출 에러(Unable to start activity ComponentInfo~) (0) | 2016.10.16 |
Fragment 재실행 에러(make sure class name exists, ~~) (1) | 2016.10.15 |