2017-09-20 4 views
0

내 활동이 LinearLayoutManagerRecyclerView을 보여줍니다. 목록의 첫 번째 항목 (View)을 가져오고 싶습니다. this post's accepted answer에 따르면, 내가 LinearLayoutManager.findViewByPosition() 메서드를 호출 할 수 있지만, 대신 null이 표시됩니다. 왜?LinearLayoutManager.findViewByPosition()가 null을 반환합니다.

RecyclerView list = findViewById(R.id.list); 
LinearLayoutManager llm = new LinearLayoutManager(this); 
list.setLayoutManager(llm); 
MyAdapter adapter = new MyAdapter(); 
list.setAdapter(adapter); 
View firstViewItem = llm.findViewByPosition(0); // <-- null 

adapter에는 항목이 포함되어 있지만 비어 있지 않습니다.

답변

1

RecyclerView의 인구가 Adapter 인 것은 비동기식이기 때문입니다. 어댑터가 완료되어 RecyclerView를 채우면 이벤트가 시작되어 findViewByPosition이 사용자에게 반환됩니다.

각 항목 크기 (너비와 높이)를 계산하고 현재 장치 디스플레이에 입력 할 수있는 항목 수를 정의해야하기 때문에 RecyclerView가 표시되는 모든 항목을 채우는 것이 어려울 때를 감지합니다.

하지만 처음으로 채워진 항목에만 액세스하면 어댑터의 onBindViewHolder 메서드에서 이벤트를 실행할 수 있습니다. 추가 된 모든 항목에 대해 이벤트를 발생시키지 않으려면 필요한 컨트롤을 삽입해야합니다.

+0

답변 해 주셔서 감사합니다. 그 사건을 어떻게들을 수 있니? –

+0

Otto Event Bus와 같은 것을 사용할 수 있습니다. 그것은 좋은 이벤트 lib를 사용할 수 있습니다. 웹에서 몇 가지 예를 찾을 수 있습니다. 가능한 경우 어디서나 이벤트 접근 방식을 사용하는 것이 좋습니다. 성능 향상에 도움이되며 명확한 코드를 작성하는 데 도움이됩니다. – firegloves

+0

하지만 RecyclerView가 언제 채워 졌는지 어떻게 알 수 있습니까? –

0

시도해보십시오.

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     View firstViewItem = llm.findViewByPosition(0); 
    } 
}, 500); 
+0

이것은 레이스 컨디션으로 들립니다 ... –

+0

리사이클 러 뷰는 아이템을 바인딩하는데 약간의 시간이 걸리기 때문에 작동합니다. 그렇지 않으면 어떤 버튼을 클릭해도 얻을 수 있습니다. 왜냐하면 setAdapter after는 뷰를 반환하지 않기 때문입니다. –