android TV开发之RecyclerView的使用以及自动加载

recyclerview我就不做介绍了,相信大家一定已经非常熟悉它了,那今天我就来讲一下recyclerView在TV中的应用,总的来说,其实在TV中的使用与在手机上的使用并无太大的差别,唯一需要处理的可能就是一个焦点问题了.

1.如何使用在TV中使用recyclerview来实现多样化的布局,这里的多样化布局就是跟腾讯视频首页那样的,分别有不同布局来组成一个界面,并向下滑动,,在手机上我们可以直接使用一个recyclerview或者listview来做为一个父容器,然后再往里面填入多个不同样式的recyclerview,这样就可以实现了,只不过有点不同的是,手机上可以直接滑动,而在TV上却是需要使用焦点来控制界面下滑的,举个列子,布局一由gridLayoutManager来垂直布局,布局二由gridLayoutManager来垂直布局,这样的话当你的焦点时无法从布局一跳到布局二上的,只有当两个布局都是平行布局的时候才可以让焦点跳动,,当然其中还有很多别的布局方式,你都可以尝试一下,,,,讲一下解决办法,,,使用瀑布流就OK了,,两个瀑布流的垂直布局是不会阻拦焦点的。。对了,关于子recyclerview的高度可以设定为自动获取的,根据item的高度去设置。

2.如何自动加载,完成分页

需求:一个页面每次加载20条数据,当焦点滚动到底部后,自动加载下一页的数据

在TV里面下拉刷新显然是不现实的,所以我在就使用自动加载来完成,,首先我们需要去判断焦点的位置在哪里,是否滚动到了底部,当页面加载完数据后,焦点是否在当前页面上

public abstract class EndlessRecyclerOnScrollListener extends
        RecyclerView.OnScrollListener {
    public static String TAG = EndlessRecyclerOnScrollListener.class
            .getSimpleName();


    private int previousTotal = 0;
    private boolean loading = true;
    int lastCompletelyVisiableItemPosition, visibleItemCount, totalItemCount, pastVisiblesItems;


    private int currentPage = 1;
    private GridLayoutManager mGridLayoutManager;

    public EndlessRecyclerOnScrollListener(
            GridLayoutManager mGridLayoutManager,) {
        this.mGridLayoutManager = mGridLayoutManager;
     
    }


    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);


        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = mGridLayoutManager.getItemCount();


        Log.v("wuxiaotol", totalItemCount + "");    //总数
        Log.v("wuxiaochi", mGridLayoutManager.getChildCount() + ""); //可见的item数量
        Log.v("wuxiaolast", mGridLayoutManager.findLastVisibleItemPosition() + ""); //最后一个




        //得到当前显示的最后一个item的view
        View lastChildView = mGridLayoutManager.getChildAt(visibleItemCount - 1);
        //得到lastChildView的bottom坐标值
        if (lastChildView != null) {
            int lastChildBottom = lastChildView.getBottom();
            //得到Recyclerview的底部坐标减去底部padding值,也就是显示内容最底部的坐标
            int recyclerBottom = recyclerView.getBottom() - recyclerView.getPaddingBottom();
            //通过这个lastChildView得到这个view当前的position值
            int lastPosition = mGridLayoutManager.getPosition(lastChildView);
            //判断lastChildView的bottom值跟recyclerBottom
            //判断lastPosition是不是最后一个position
            //如果两个条件都满足则说明是真正的滑动到了底部
            if (lastChildBottom == recyclerBottom && lastPosition == totalItemCount - 1&&totalItemCount>=20) {
                Log.v("wuxiao_last", "滑动到最后了");
                Log.v("wuxiao_cur", currentPage + "");
                currentPage++;
                onLoadMore(currentPage);
                loading = true;
            }
        }
    }


    public abstract void onLoadMore(int currentPage);
}


上面的代码是一个自定义的布局布局管理器,在这个布局管理器里面主要做了这么几个操作,首先获取当前页面显示的最后一个itemView的位置,然后再获取recyclerView的底部,判断焦点是否滑动到了底部,如果滑动到底部后,当前页面加1并传给activity进行网络操作,,如果你在加载完数据后发现焦点不见了,没关系,先找到焦点去了哪里,然后再重新定义焦点的位置,,焦点不会失踪,如果你看不到,只能说明焦点在你看不到的地方,,

好的,我可以帮你解答这个问题。 首先,你需要在你的项目中添加 RecyclerView 的依赖项。可以在 `build.gradle` 文件中添加以下依赖项: ``` dependencies { implementation 'androidx.recyclerview:recyclerview:1.2.0' } ``` 接下来,你需要在你的布局文件中添加一个 RecyclerView 控件。例如: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后,你需要创建一个 RecyclerView 的 Adapter 类,并在里面实现数据绑定逻辑。例如: ``` public class SmsAdapter extends RecyclerView.Adapter<SmsAdapter.ViewHolder> { private List<Sms> smsList; public SmsAdapter(List<Sms> smsList) { this.smsList = smsList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sms, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Sms sms = smsList.get(position); holder.tvAddress.setText(sms.getAddress()); holder.tvBody.setText(sms.getBody()); } @Override public int getItemCount() { return smsList.size(); } static class ViewHolder extends RecyclerView.ViewHolder { TextView tvAddress; TextView tvBody; ViewHolder(@NonNull View itemView) { super(itemView); tvAddress = itemView.findViewById(R.id.tv_address); tvBody = itemView.findViewById(R.id.tv_body); } } } ``` 在 Adapter 类中,我们定义了一个 ViewHolder 类来保存 RecyclerView 中的每个 item 的视图。在 onCreateViewHolder 方法中,我们创建 ViewHolder 对象并返回它。在 onBindViewHolder 方法中,我们将数据绑定到 ViewHolder 中的视图上。 接下来,你需要在你的 Activity 或 Fragment 类中实现 RecyclerView 的初始化逻辑。例如: ``` public class SmsActivity extends AppCompatActivity { private List<Sms> smsList = new ArrayList<>(); private SmsAdapter smsAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sms); RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); smsAdapter = new SmsAdapter(smsList); recyclerView.setAdapter(smsAdapter); // 加载短信数据 loadSmsData(); } private void loadSmsData() { // TODO: 加载短信数据并添加到 smsList 中 // 省略具体实现 } } ``` 在这个例子中,我们在 onCreate 方法中初始化了 RecyclerView,设置了布局管理器和 Adapter,并在 loadSmsData 方法中加载短信数据并将其添加到 smsList 中。最后,我们需要调用 Adapter 的 notifyDataSetChanged 方法来刷新 RecyclerView 的内容。例如: ``` private void loadSmsData() { // 加载短信数据并添加到 smsList 中 smsList.addAll(getSmsList()); smsAdapter.notifyDataSetChanged(); } ``` 这样就可以在 RecyclerView 中显示短信内容了。当有新的短信到达时,你需要更新 smsList 数据并调用 Adapter 的 notifyDataSetChanged 方法来刷新 RecyclerView 的内容。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值