Kevin Learn Recyclerview-->Leanback 中的 HorizontalGridView

Posted Kevin_小飞象

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kevin Learn Recyclerview-->Leanback 中的 HorizontalGridView相关的知识,希望对你有一定的参考价值。

LeanBack 是 Google 官方推出的 TV 端的功能库,里面包含了很多在 TV android 端开发常用的控件,本文重点介绍其对 RecyclerView 适配 TV 端做的封装:HorizontalGridView 。

效果图

属性 & 方法

  • focusOutFront、focusOutEnd
    如果标题栏使用 HorizontalGridView 实现,内容区域使用 Fragment 里放的 VerticalGridView 实现,可能出现标题栏和内容区焦点切换不成功的问题,比如说,焦点不能从内容区切到标题栏这样的情况。这时使用 focusOutFront 和 focusOutEnd 属性能够解决问题,解决不同容器里焦点切换不成功的问题。

  • setHorizontalSpacing()
    设置 HorizontalGridView 的 Item 之间的间距。

  • setFocusScrollStrategy()
    设置焦点的滚动方式,它的参数有3个可选值,默认值为 FOCUS_SCROLL_ALIGNED;

    • FOCUS_SCROLL_ALIGNED:焦点在中间
    • FOCUS_SCROLL_ITEM:焦点在末尾
    • FOCUS_SCROLL_PAGE:翻页
  • setNumRows()
    设置行数,默认 HorizontalGridView 为一行,通过 setNumRows 方法可以设置多行。但有个注意点,设置多行后要注意 position 的位置。

  • setRowHeight()
    设置 HorizontalGridView 的 Item 的高度,而不是用来设置 HorizontalGridView 的高度。

  • setSelectedPosition()、setSelectedPositionSmooth()
    让某个 position 获取焦点,区别在于 setSelectedPositionSmooth 在移动时更平滑一点。

  • duplicateParentState()
    它的放大的焦点 View 是每个 Item 的最外层布局,而不是图标那个View,但是其焦点框却套在了图标那个 View 上,那这种效果如果我来实现就会用到 duplicateParentState 属性了。duplicateParentState 的意思是:当前控件是否跟随父控件的(点击、焦点等)状态。

基本使用

1. 添加依赖

	implementation 'androidx.leanback:leanback:1.0.0'
    implementation 'androidx.leanback:leanback-preference:1.0.0'

2. 布局文件

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_focus" android:state_focused="true" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="300dp" />
    <solid android:color="#FF4081" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/teal_200"
    tools:context=".widget.WidgetActivity">

    <androidx.leanback.widget.HorizontalGridView
        android:id="@+id/hg_title"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        app:focusOutEnd="true"
        app:focusOutFront="true"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_title"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:background="@drawable/bg_title"
    android:clickable="true"
    android:focusable="true"
    android:gravity="center"
    android:textColor="#FFFFFF"
    android:focusableInTouchMode="true"
    android:paddingLeft="30dp"
    android:paddingRight="30dp"
    android:textSize="28sp" />

3. 创建 Presenter

/**
 * Created on 2022/4/16 17:51
 *
 * @author Gong Youqiang
 */
public class TitlePresenter extends Presenter 
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup) 
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_title, viewGroup, false);
        return new ViewHolder(view);
    

    @Override
    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object o) 
        if (o instanceof Title) 
            ViewHolder vh = (ViewHolder) viewHolder;
            vh.tvTitle.setText(((Title) o).getName());
        
    

    @Override
    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) 

    

    static class ViewHolder extends Presenter.ViewHolder 
        TextView tvTitle;

        public ViewHolder(View view) 
            super(view);
            tvTitle = view.findViewById(R.id.tv_title);
        

    

4. Title.java

/**
 * Created on 2022/4/16 17:53
 *
 * @author Gong Youqiang
 */
public class Title 
    private String name;

    public Title(String name) 
        this.name = name;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

5. TitleModel

/**
 * Created on 2022/4/16 17:53
 *
 * @author Gong Youqiang
 */
public class TitleModel 
    public static List<Title> getTitleList() 
        List<Title> titleList = new ArrayList<>();
        titleList.add(new Title("儿童模式"));
        titleList.add(new Title("家庭模式"));
        titleList.add(new Title("商务模式"));
        return titleList;
    

  1. 使用
public class WidgetActivity extends AppCompatActivity 
    @BindView(R.id.hg_title)
    HorizontalGridView horizontalGridView;
    @SuppressLint("RestrictedApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_widget);
        ButterKnife.bind(this);
        horizontalGridView.setHorizontalSpacing(30);
        ArrayObjectAdapter arrayObjectAdapter = new ArrayObjectAdapter(new TitlePresenter());
        ItemBridgeAdapter itemBridgeAdapter = new ItemBridgeAdapter(arrayObjectAdapter);
        horizontalGridView.setAdapter(itemBridgeAdapter);
        horizontalGridView.setFocusScrollStrategy(BaseGridView.FOCUS_SCROLL_ITEM);
        arrayObjectAdapter.addAll(0, TitleModel.getTitleList());
    

以上是关于Kevin Learn Recyclerview-->Leanback 中的 HorizontalGridView的主要内容,如果未能解决你的问题,请参考以下文章

Kevin Learn RecyclerView--> 实现二级列表

Kevin Learn Recyclerview-->Leanback 中的 HorizontalGridView

Kevin Learn Recyclerview-->UltimateRecyclerView 的基本使用

Kevin Learn RecyclerView--> Retrofit + RxJava + OkHttp 网络请求

Kevin Learn Recyclerview-->SpringView (下拉刷新)的基本使用

Kevin Learn Kotlin:函数