2016-10-04 15 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> 

Horizo​​ntalPersistentFocusWrapperがPersistentFocusWrapperしかしmPersistFocusVertical = FALSEと同じです。

クラッシュはこの場所でoccure:

@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
詳細はこのリンクを参照してください使用:
https://code.google.com/p/android/issues/detail?id=190526&thanks=190526&ts=1445108573

は今重要な部分のために:RecyclerViewの
新バージョンでは、(高さと幅のような)その子の規則に従うために始めたが。 あなたに子アイテムを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

ちょうど確かめてください。 Horizo​​ntalPersistentFocusWrapperは、RecyclerViewを垂直のLinearLayoutマネージャー、場合によっては他のビューでラップするために使用されます。水平LineaLayoutManagersでRecyclerViewsをラップするには、VerticalPersistentFocusWrapperを使用してください。 –

関連する問題