AndroidTV开发6实现竖向TV导航栏切换

前言:

Android中TV开发经常见到竖向排列的栏目列表和内容,今天就来讲讲怎么实现的。最开始我的实现方式的用一个竖向的第三方tablayout库,喜气洋洋的引用到项目中,效果也实现了,因为我们的项目有单选、上一步、下一步、刷新等按钮操作,发现有时候快速操作,焦点很混乱,而且后期扩展也不是很好,此方案被项目组老大给否定了.于是改为ListView,这时扩展问题解决了,但是发现焦点乱跑问题还是没有解决,于是改为Recyclerview,只需要把方向改为竖向排列即可,还可以自定义间距大小、添加动画等。所以功能采用更为强大的Recyclerview,解决了扩展、动画、焦点乱跑等问题.

一、TV竖向排列的栏目列表有以下几种实现方案:

1.自定义竖向的Tablayout

2.RecyclerView

二、由于第1种方式有bug,且扩展性不好,修改起来很麻烦,这里就不写出源码了,给出第2种方案,主要是一个横向的Recyclerview和一个竖向的栏目Tab,代码如下:

1.布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/color_141843"
    android:orientation="horizontal">
​
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_tab"
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:layout_gravity="center" />
​
    <View
        android:layout_width="1dp"
        android:layout_height="match_parent"
        android:background="@color/white" />
​
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_game_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" />
</LinearLayout>

2.Activity代码如下:

代码很简单,两个Recyclerview,初始化数据和控件,获取焦点的效果和事件

package com.example.tvrecyclerview;
​
import android.os.Bundle;
import android.view.View;
​
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
​
import com.example.tvrecyclerview.adapter.GameListAdapter;
import com.example.tvrecyclerview.adapter.MyRecycleViewAdapter;
import com.example.tvrecyclerview.bean.GameListBean;
import com.example.tvrecyclerview.view.SpaceDecoration;
​
import java.util.ArrayList;
import java.util.List;
​
/**
 * @author: njb
 * @date: 2020/7/12 0012 23:33
 * @desc: 竖直的Tab切换,仿TV频道切换
 */
public class VerticalTabActivity extends AppCompatActivity implements MyRecycleViewAdapter.OnItemClickListener{
​
    private MyRecycleViewAdapter adapter;
    private RecyclerView recyclerView, rvGameList,rvTimeList;
    //标题
    private String[] titles = {"首页", "游戏", "教育", "生活", "娱乐", "新闻", "直播", "我的"};
    private GameListAdapter gameListAdapter;
    private List<GameListBean> gameListBeans;
​
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vertical_recyclerview);
        initView();
        initAdapter();
        initGameListAdapter();
    }
    private void initView() {
        recyclerView = findViewById(R.id.rv_tab);
        rvGameList = findViewById(R.id.rv_game_list);
    }
​
​
    private void initGameListAdapter() {
        setData();
        gameListAdapter = new GameListAdapter(gameListBeans, this, new GameListAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
​
            }
        }) {
            @Override
            protected void onItemFocus(View itemView) {
                itemView.setSelected(true);
                View view = itemView.findViewById(R.id.iv_bg);
                view.setSelected(true);
            }
​
            @Override
            protected void onItemGetNormal(View itemView) {
                itemView.setSelected(true);
                View view = itemView.findViewById(R.id.iv_bg);
                view.setSelected(true);
            }
        };
        rvGameList.setLayoutManager(new GridLayoutManager(this,5));
        rvGameList.addItemDecoration(new SpaceDecoration(30));
        rvGameList.setAdapter(gameListAdapter);
    }
​
    private void initAdapter() {
        adapter = new MyRecycleViewAdapter(this, titles);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(adapter);
        recyclerView.requestFocus();
        adapter.setOnItemClickListener(this);
    }
​
    private void updateData(String title) {
        if (gameListBeans != null && gameListBeans.size() > 0) {
            gameListBeans.clear();
        }
        for (int i = 0; i < 40; i++) {
            GameListBean gameListBean = new GameListBean();
            gameListBean.setGameName(title);
            gameListBean.setImg("2");
            gameListBeans.add(gameListBean);
​
        }
        gameListAdapter.notifyDataSetChanged();
    }
​
    private void setData() {
        gameListBeans = new ArrayList<>();
        for (int i = 0; i < 40; i++) {
            GameListBean gameListBean = new GameListBean();
            gameListBean.setGameName("王者荣耀");
            gameListBean.setImg("2");
            gameListBeans.add(gameListBean);
        }
    }
​
    @Override
    public void onItemClick(View view, int position) {
        updateData(titles[position]);
    }
}

3.实现的效果截图如下:

img

img

4.以上就是实现代码和选择方案分析,

由于项目过去3年了,所以一些的细节问题记不太清了,这里没有做非常详细的问题和项目方案选择分析,小伙伴们如果有更好地方案可以给我留言,我会积极采纳,一起学习,共同成长.后面有时间会整理出焦点错乱的案例和分析.

5.项目的源码地址如下:

TvRecyclerView: TV项目,使用recyclerview实现标题切换和焦点效果

​​​​​​​

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android TV的界面通常使用垂直的二级列表来展示不同的选项。在实现这样的界面时,可以使用ExpandableListView和Fragment来完成。 首先,我们可以在布局文件中添加一个ExpandableListView来显示一级和二级列表。在Activity或者Fragment中,我们可以通过代码来设置ExpandableListView的适配器,并实现对应的方法来填充数据。 接下来,我们可以创建一个Fragment,用于显示一级列表的选项。该Fragment会包含一个ExpandableListView,并通过适配器来填充一级列表的数据。一个ExpandableListView适配器需要实现ExpandableListAdapter接口,并重写对应的方法,例如getGroupCount()、getChildrenCount()和getChildView()等方法。 在第一级列表的每个选项被点击时,我们可以通过OnClickListener来监听并获取选中的位置。然后,我们可以加载对应的子级列表的Fragment,并将其添加到Activity或者父级Fragment中的布局中。 对于二级列表的数据填充,我们可以创建一个继承自BaseExpandableListAdapter的适配器。这个适配器需要实现对应的方法,例如getChild()、getChildId()、getGroup()和getGroupId()等方法来填充数据。 最后,通过FragmentTransaction将我们的Fragment添加到Activity或者父级Fragment的布局中,并提交事务即可完成。这样,我们就实现Android TV上的二级竖向展示界面。 总结来说,使用ExpandableListView和Fragment可以实现Android TV的二级竖向展示界面。我们可以通过ExpandableListView的适配器来填充一级列表的数据,并在点击一级列表选项时动态加载并显示对应的二级列表的Fragment。通过这样的方式,我们可以方便地实现Android TV上的界面布局。 ### 回答2: 在Android TV上,我们可以使用ExpandableListView和Fragment来实现二级竖向界面。 首先,我们需要创建一个ExpandableListView来呈现父级项和子级项。ExpandableListView是Android提供的一个可展开和折叠的列表视图,可以用于显示具有层级关系的数据。我们可以使用Adapter来为ExpandableListView提供数据。 接下来,我们需要使用Fragment来实现二级竖向界面。Fragment是Android提供的一种可以嵌套于Activity的独立组件,可以灵活地管理视图层次结构并自己处理用户界面交互。我们可以创建两个Fragment,一个用于显示父级项列表,另一个用于显示选中的父级项对应的子级项列表。 在父级项列表Fragment中,我们可以使用ExpandableListView来展示父级项。我们可以使用一个自定义的ExpandableListAdapter来为ExpandableListView提供数据,并在父级项被点击时,更新选中的父级项的子级项数据。 在子级项列表Fragment中,我们可以根据点击的父级项的位置获取对应的子级项数据,并使用RecyclerView或ListView来展示子级项。 通过在Fragment中嵌套使用ExpandableListView和子级项列表,我们可以实现一个二级竖向的界面。用户可以点击父级项来展开或折叠子级项,并可以在子级项列表中进行滚动浏览。这样可以提供良好的用户体验。 总结起来,使用ExpandableListView和Fragment,我们可以实现一个二级竖向的界面,用于在Android TV上展示层级关系的数据。 ### 回答3: 在Android TV上,可以使用ExpandableListView和Fragment来实现二级竖向布局。 首先,创建一个Fragment用于显示ExpandableListView。在Fragment的布局文件中,可以使用ExpandableListView来展示二级竖向布局。ExpandableListView需要一个Adapter来提供数据,因此需要创建ExpandableListAdapter。ExpandableListAdapter需要实现父项和子项的数据提供,决定每个父项和子项的视图。在Adapter中,可以使用ParentItem作为父项的数据模型,ChildItem作为子项的数据模型。然后,通过重写getGroupCount()、getChildCount()、getGroup()、getChild()等方法,将数据绑定到ExpandableListView上。 接下来,创建一个Fragment用于显示二级竖向布局的子项内容。在这个Fragment中,可以展示子项所需的内容。可以根据需要自定义布局文件,用于展示每个子项的UI元素。在这个Fragment中,可以根据需要加载和显示不同的子项内容。 在主Activity中,可以使用FragmentManager来管理Fragment的显示和切换。当父项被点击时,可以通过监听ExpandableListView的OnChildClickListener,获取子项的位置信息,并根据位置信息加载对应的子项内容Fragment,并将其添加到FragmentManager中显示。 以上就是使用Android TV上的ExpandableListView和Fragment实现二级竖向布局的基本步骤。通过适当调整布局和数据,可以实现不同的二级竖向布局效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值