Android TV RecyclerView重点互动

时间:2016-08-31 11:09:16

标签: android android-recyclerview android-tv

我目前正在使用常规RecyclerView GridLayoutManager spanCountviewType取决于RecyclerView Android电视应用。一切都很好,但我有两个问题:

  1. 如果您长按dpad以在项目之间快速滚动,有时焦点会丢失到不属于RecyclerView的孩子的视图中。
  2. 如何告诉VerticalGridView将当前的焦点视图保留在网格的中心?
  3. 似乎列出的问题是使用LeanBack库中的LayoutManger修复的,但它使用的spanCount是内部的,并且不支持*=

3 个答案:

答案 0 :(得分:2)

Recycler视图适用于Android TV。您可以包含的可能解决方案是:

1.add focusable和focusableInTouchode to view。通过代码添加focusListner,并在每次单击视图时请求焦点。

2.要将以Recycler View为重点的项目保持在中心,您必须覆盖布局管理器,就像这个例子一样。

RecyclerView smoothScroll to position in the center. android

使用layoutManager.scrollToPositionWithOffset(position,offset),其中以位置为中心的视图位置和偏移量是回收者视图宽度/ 2.

答案 1 :(得分:1)

  1. 对于常规extern crate rand; use rand::Rng; fn main() { let mut rng = rand::thread_rng(); let mut v = vec![ vec![0f64; 35], vec![0f64; 35], vec![0f64; 35], vec![0f64; 35], ]; for el in &mut v { for q in el { *q = rng.gen::<f64>(); } } println!("vec: {:?}", v); }

    • 我必须指定:let mut rng = rand::thread_rng(); let v: Vec<Vec<f64>> = (0..4) .map(|_| (0..35).map(|_| rng.gen()).collect()) .collect(); println!("vec: {:?}", v);

    • 并且RecyclerView也设置为将焦点发送给RV本身。

  2. 我看到的唯一解决方案是选择要定位android:descendantFocusability="beforeDescendants"的项目的关键听众。

答案 2 :(得分:0)

使用d-pad导航时,您可以尝试使用workaround检查此bug SO question RecycleView焦点滚动。

这是{{3}}。

这里的问题是GridLayoutManager使用LinearLayoutManager onFocusSearchFailed()的实现,当焦点接近RecyclerView的内边界时调用LinearLayoutManager'snumpy.percentile(df.a,95) # attention : the percentile is given in percent (5 = 5%) 实现只提供第一个/最后一个(取决于滚动方向)元素。因此焦点跳转到新行的第一个/最后一个元素。

因此,也许这种解决方法可以解决您的问题,或者让您了解如何解决问题。