RecyclerView ScrollBar(Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollVertically()' on a null object reference)

Posted by ITPangPang
2017. 1. 22. 23:15 안드로이드 에러/RuntimeException


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와 연결하면

해결된다.