2016-10-04 8 views
3

Android TV에 적응해야하는 애플리케이션이 있습니다. 이 응용 프로그램에는 수평 RecyclerView가 포함되어 있으며 리모컨의 D 패드 단추를 누를 때 스크롤되지 않습니다. this solution을 찾았지만 충돌이 발생합니다. 여기 코드이다Android TV에서 RecyclerView에서 스크롤링을 구현하는 방법은 무엇인가요?

<ru.myapp.package.HorizontalPersistentFocusWrapper 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="250dp" 
      android:background="@null" 
      android:scrollbars="none"/> 
</ru.myapp.package.HorizontalPersistentFocusWrapper> 

HorizontalPersistentFocusWrapper PersistentFocusWrapper는하지만 mPersistFocusVertical = 거짓과 동일하다;

충돌이 곳에서 발생 시킬수 :

@Override 
    public void requestChildFocus(View child, View focused) { 
     super.requestChildFocus(child, focused); 
     View view = focused; 
     while (view != null && view.getParent() != child) { 
      view = (View) view.getParent(); <<<------ Crash here 
     } 
     mSelectedPosition = view == null ? -1 : ((ViewGroup) child).indexOfChild(view); 
     if (DEBUG) Log.v(TAG, "requestChildFocus focused " + focused + " mSelectedPosition " + mSelectedPosition); 
    } 

충돌 스택 트레이스를 :

java.lang.ClassCastException: android.view.ViewRootImpl cannot be cast to android.view.View 
     at ru.myapp.package.HorizontalPersistentFocusWrapper.requestChildFocus(HorizontalPersistentFocusWrapper.java:108) 
     at android.view.View.handleFocusGainInternal(View.java:5465) 
     at android.view.ViewGroup.handleFocusGainInternal(ViewGroup.java:714) 
     at android.view.View.requestFocusNoSearch(View.java:8470) 
     at android.view.View.requestFocus(View.java:8449) 
     at android.view.ViewGroup.requestFocus(ViewGroup.java:2747) 
     at android.view.View.requestFocus(View.java:8416) 
     at android.support.v4.widget.NestedScrollView.arrowScroll(NestedScrollView.java:1222) 
     at android.support.v4.widget.NestedScrollView.executeKeyEvent(NestedScrollView.java:551) 
     at android.support.v4.widget.NestedScrollView.dispatchKeyEvent(NestedScrollView.java:512) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 

답변

4

가장 최근 버전의 RecyclerView를 사용하십시오. 또는 추가 정보를 원하시면이 링크를 참조 적어도
com.android.support:recyclerview-v7:23.2.0
사용 RecyclerView의
새로운 버전 (높이와 폭 등) 그 아이의 규칙을 순종하기 시작 : 중요한 부분에 대해 지금
https://code.google.com/p/android/issues/detail?id=190526&thanks=190526&ts=1445108573

을 . 당신이 자식 항목 XML의 루트 뷰를 설정해야합니다 : 의도 것처럼 이제
android:focusable="true"

, 스크롤 이동합니다.

+0

감사합니다 !!! 내 문제를 해결했습니다 ... 이제는 Recyclerview에서 스크롤 할 수 있습니다. – skm

1

이보십시오. 나를 위해 일합니다.

@Override 
public void requestChildFocus(View child, View focused) { 
    super.requestChildFocus(child, focused); 
    View view = focused; 
    while (view != null && view.getParent() != child) { 
     try { 
      view = (View) view.getParent(); 
     } catch (ClassCastException e) { 
      view = null; 
     } 
    } 
    mSelectedPosition = view == null ? -1 : ((ViewGroup) child).indexOfChild(view); 
    if (DEBUG) 
     Log.v(TAG, "requestChildFocus focused " + focused + " mSelectedPosition " + mSelectedPosition); 
} 
+0

답변 해 주셔서 감사합니다. 이 코드를 사용하면 크라 슈가 발생하지 않습니다. 그러나 RecyclerView는 D 패드에 반응하지 않습니다. – BArtWell

+1

그냥 확인하십시오. HorizontalPersistentFocusWrapper는 RecyclerView를 세로 형 LinearLayout 관리자 및 다른보기로 래핑하는 데 사용됩니다. 수평 LineaLayoutManagers로 RecyclerViews를 래핑하려면 VerticalPersistentFocusWrapper를 사용하십시오. –

관련 문제