美文网首页Android TV
Android TV中实现RecyView循环功能

Android TV中实现RecyView循环功能

作者: JackDaddy | 来源:发表于2018-04-28 12:01 被阅读28次

    RecycleView 用法 :

    1. [endif]在Gradle中添加

    implementation 'com.android.support:recyclerview-v7:26.0.2'

    2. [endif]在主布局文件里添加RecycleView

    3. [endif]创建item布局文件

    在电视开发中,需要添加focusable 与 focusableintouchmode 才可以获得焦点。

    4. [endif]创建adapter继承RecyclerView.Adapter

    5. [endif]在adapter中添加缺省方法

    1) [endif]On create ViewHolder()方法是将item布局加载到recycleView 的方法

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_2, parent, false);

    创建一个ViewHolder,并添加到ViewHolder里面去,最后返回这个ViewHolder:

    ViewHolder holder = new ViewHolder(view);return holder;

    2) OnbindViewHolder()是将ViewHolder绑定到RecycleView上面时调用的方法

    可在这里做更新View的操作。

    3) [endif]GetItemCount 方法为返回数据长度的方法。一般返回值为:

    return XXX.size();

    4) [endif]在adapter中创建一个viewHolder,继承

     RecyclerView.ViewHolder

    在这里创建item布局中的控件对象,在public ViewHolder(View itemView)

    方法中初始化:

    tvItem2 = itemView.findViewById(R.id.tv_item_2);

    6. 在adapter 中创建一个数据对象用来接收想要传入的数据,在结构体中接收传入的数据例如:

    private List mData;

    在Activity中的操作

    1. [endif]创建recycleView对象,创建layoutManager(布局管理器)对象,创建adapter对象,创建数据对象

    2. 实例化recycleView对象,layoutManager对象,adapter对象

    RecycleView有几种布局管理器可用,可实现线性,网格,以及瀑布流的界面,以下为线性布局:

    mlayoutManager = new LinearLayoutManager(this);

    以下为网格布局:

    //mlayoutManager = new GridLayoutManager(this,3,GridLayoutManager.HORIZONTAL,false);

    3.为recycleview 设置布局管理器:

    viewRecy2.setLayoutManager(mlayoutManager);

    4.为recycleview设置adapter:

    //3 设置数据适配器viewRecy2.setAdapter(myAdapter);

    如果要在每一个item中添加事件,采取事件回调的方法,其他自定义View的回调皆类似,以下以添加点击事件为例:

    1) 在adapter中添加点击事件的接口,并添加接口方法:

    public interface onItemClickListener {    void onItemClick(View view, int position);}

    2) [endif]在adapter中创建接口实例

    private onItemClickListener onItemClickListener;

    3) 在adapter创建对应set方法体来接收Activity传入的对象

    public void setOnItemClickListener(onItemClickListener onItemClickListener) {    this.onItemClickListener = onItemClickListener;}

    4)在onbindViewholde中判断是否设置了监听器

    if (onItemClickListener !=null) {

    //为ItemView设置监听器

            holder.tvItem2.setOnClickListener(new View.OnClickListener() {

    @Override

                public void onClick(View v) {

    int position =holder.getLayoutPosition();

                    onItemClickListener.onItemClick(holder.tvItem2, position);

                    //onItemClickListener.onItemClick();

                }

    });

        }

    }

    5) 最后在activity中通过adapter对象调用onset方法,实现点击事件

    myAdapter.setOnItemClickListener(new MyAdapter.onItemClickListener() {

    @Override

                public void onItemClick(View view, int position) {

    lastPosition =currentPosition;

                    currentPosition = position;

    //                Toast.makeText(RecycleActivity_2.this, "click+" + position, Toast.LENGTH_SHORT).show();

                    myAdapter.notifyItemChanged(currentPosition);

                    myAdapter.notifyItemChanged(lastPosition);

                }

    });

    Android TV中RecycleView的Item循环实现

    (1) 在TV中遥控器的按键取代了手机的滑动,因此我们要监听遥控器的按键,因此在adapter中的item监听setonkeylistener方法。

    并获取item所在位置的position,存到tag里面

    holder.tvItem2.setTag(position);

     

    当在第一个Item中按向上键时,position<0,此时我们调用移动到最后一个,同理,当在最后一个时,移动到第一个。

    smoothScrollToPosition(getItemCount() - 1)

    holder.tvItem2.setOnKeyListener(new View.OnKeyListener() {

    @Override

                public boolean onKey(View v, int keyCode, KeyEvent event) {

    int action = event.getAction();

    //                Log.e("---", keyCode + "");

                    switch (keyCode) {

    case KeyEvent.KEYCODE_DPAD_UP:

    int positionUp = (int) v.getTag();

                            if (action == KeyEvent.ACTION_DOWN) {

    if (positionUp <=0) {

    recyclerView.smoothScrollToPosition(getItemCount() -1);

    return true;

                                }

    }

    break;

                        case KeyEvent.KEYCODE_DPAD_DOWN:

    int positionDown = (int) v.getTag();

                            if (action == KeyEvent.ACTION_DOWN) {

    if (positionDown >= getItemCount() -1) {

    recyclerView.smoothScrollToPosition(0);

    return true;

                                }

    }

    break;

                    }

    return false;

                }

    });

     

    (2) 然后在activity中封装了一个回滚方法来判断按键是否到达底部,并重新获取焦点

    public void scroolChange(RecyclerView recyclerView, boolean toFirst, boolean toLast) {

    LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();

        int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();

        int firstVisibleItem = manager.findFirstCompletelyVisibleItemPosition();

        int totalItemCount = manager.getItemCount();

        //向下滚动,到底部

        if (lastVisibleItem == (totalItemCount -1) && toLast) {

    View view = recyclerView.getChildAt(lastVisibleItem);

            LinearLayoutManager llM = (LinearLayoutManager) recyclerView.getLayoutManager();

            if (view !=null) {

    view.requestFocus();

            }else if (llM.findViewByPosition(lastVisibleItem) !=null) {

    llM.findViewByPosition(lastVisibleItem).requestFocus();

            }else {

    recyclerView.requestFocus();

            }

    }

    //向上滚动,到顶部

        if (firstVisibleItem ==0 && toFirst) {

    View view = recyclerView.getChildAt(firstVisibleItem);

            LinearLayoutManager llM = (LinearLayoutManager) recyclerView.getLayoutManager();

            if (view !=null) {

    view.requestFocus();

            }else if (llM.findViewByPosition(firstVisibleItem) !=null) {

    llM.findViewByPosition(firstVisibleItem).requestFocus();

            }else {

    recyclerView.requestFocus();

            }

    }

    }

    (3) 最后在recycleView 调用addscrolllistener方法,来监听recycleView的滚动状态

    由于setonScrollListener有时回产生空指针,因此建议使用add方法

    viewRecy2.addOnScrollListener(new RecyclerView.OnScrollListener() {

    boolean toLast =false;

                boolean toFirst =false;

                @Override

                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

    super.onScrollStateChanged(recyclerView, newState);

                    if (newState == recyclerView.SCROLL_STATE_IDLE) {

    //                    Log.e("---", "底部");

                        scroolChange(recyclerView, toFirst, toLast);

                    }

    }

    @Override

                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

    super.onScrolled(recyclerView, dx, dy);

                    if (dy >0) {

    toLast =true;

                    }else {

    toFirst =true;

                    }

    }

    });

    Add中包含两个方法,都可以来判断是否到达顶部或底部。至此,实现了Android TV中RecycleView的循环功能。

    相关文章

      网友评论

        本文标题:Android TV中实现RecyView循环功能

        本文链接:https://www.haomeiwen.com/subject/ezxakftx.html