Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码

本文讲述了Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码。分享给大家供大家参考,具体如下:

1.先贴出自己的效果图(可横向滚动,并响应item点击事件):

2.关于点击事件的实现细节

核心:使用接口回调

在adapter中自己定义了个接口,然后在onBindViewHolder中去为holder.itemView去设置相应的监听最后回调我们设置的监听。

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{
//...
 public interface OnItemClickLitener
 {
 void onItemClick(View view, int position);
 void onItemLongClick(View view , int position);
 }
 private OnItemClickLitener mOnItemClickLitener;
 public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
 {
 this.mOnItemClickLitener = mOnItemClickLitener;
 }
 @Override
 public void onBindViewHolder(final MyViewHolder holder, final int position)
 {
 holder.tv.setText(mDatas.get(position));
 // 如果设置了回调,则设置点击事件
 if (mOnItemClickLitener != null)
 {
  holder.itemView.setOnClickListener(new OnClickListener()
  {
  @Override
  public void onClick(View v)
  {
   int pos = holder.getLayoutPosition();
   mOnItemClickLitener.onItemClick(holder.itemView, pos);
  }
  });
  holder.itemView.setOnLongClickListener(new OnLongClickListener()
  {
  @Override
  public boolean onLongClick(View v)
  {
   int pos = holder.getLayoutPosition();
   mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
   return false;
  }
  });
 }
 }
//...
}

在activity设置监听,并实现接口

mAdapter.setOnItemClickLitener(new OnItemClickLitener()
 {
  @Override
  public void onItemClick(View view, int position)
  {
  Toast.makeText(HomeActivity.this, position + " click",
   Toast.LENGTH_SHORT).show();
  }
  @Override
  public void onItemLongClick(View view, int position)
  {
  Toast.makeText(HomeActivity.this, position + " long click",
   Toast.LENGTH_SHORT).show();
   mAdapter.removeData(position);
  }
 }); 

3.实现横向效果

核心:LinearLayoutManager

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false);
mRecyclerView.setLayoutManager(linearLayoutManager); 

4. 让RecyclerView的子item获得焦点

mRecyclerView.setOnFocusChangeListener(new OnFocusChangeListener() {
  @Override
  public void onFocusChange(View v, boolean hasFocus) {
  if(hasFocus){
   if(mRecyclerView.getChildCount()>0){
   mRecyclerView.getChildAt(0).requestFocus();
   }
  }
  }
 });

5.代码实现:

//定义自己的布局文件
public class EasyLayout extends LinearLayout{
 private MyAdapter mAdapter;
 private RecyclerView mRecyclerView;
 private Context mContext;
 private List<String> mDatas;
 public EasyLayout(Context context) {
 super(context);
 mDatas = new ArrayList<String>();
 for (int i=0;i<20;i++){
  String str = "图片:"+i;
  mDatas.add(str);
 }
 this.setBackgroundColor(Color.parseColor("#407EAf"));
 this.mContext = context;
 this.setOrientation(VERTICAL);
 createLayout();
 }
 private void createLayout() {
 //空出上边留白
 TextView te = new TextView(mContext);
 ViewGroup.LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,160);
 this.addView(te,lp);
 mRecyclerView = new RecyclerView(mContext);
 lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
 this.addView(mRecyclerView,lp); 

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false);
 mRecyclerView.setLayoutManager(linearLayoutManager);
 //设置适配器
 mAdapter = new MyAdapter( mContext,mDatas);
 mRecyclerView.setAdapter(mAdapter);
 //监听点击事件
 mAdapter.setmOnItemClickLitener(new MyAdapter.OnItemClickLitener() {
  @Override
  public void onItemClick(View view, int position) {
  Toast.makeText(mContext,"点击了图片:"+position,Toast.LENGTH_SHORT).show();
  }
 }); 

 //让RecyclerView的子item获得焦点
 mRecyclerView.setOnFocusChangeListener(new OnFocusChangeListener() {
  @Override
  public void onFocusChange(View v, boolean hasFocus) {
  if(hasFocus){
   if(mRecyclerView.getChildCount()>0){
   mRecyclerView.getChildAt(0).requestFocus();
   }
  }
  }
 });
 } 
//定义适配器类
 public static class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>
 {
 private Context mContext;
 private List<String> mDatas;
 private LayoutInflater mInflater;
 private OnItemClickLitener mOnItemClickLitener;
 //定义点击事件的接口
 public interface OnItemClickLitener
 {
  void onItemClick(View view, int position);
 }
 public MyAdapter( Context mContext,List<String> datats)
 {
  this.mContext = mContext;
  this.mDatas = datats;
  mInflater = LayoutInflater.from(this.mContext);
 }
 public void setmOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
 {
  this.mOnItemClickLitener = mOnItemClickLitener;
 }
 @Override
 public int getItemCount()
 {
  return mDatas.size();
 }
 /**
  * 创建ViewHolder
  */
 @Override
 public ViewHolder onCreateViewHolder(ViewGroup parent, int i)
 {
  View view = mInflater.inflate(R.layout.easy_item,null);
  ViewHolder viewHolder = new ViewHolder(view);
  return viewHolder;
 }
 /**
  * 设置值
  */
 @Override
 public void onBindViewHolder(final ViewHolder viewHolder, final int position)
 {
  viewHolder.btn.setText(mDatas.get(position));
  viewHolder.btn.setTextSize(40);
  viewHolder.btn.setGravity(Gravity.CENTER);
  //设置回调
  if (mOnItemClickLitener != null){
  viewHolder.btn.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
   int pos = viewHolder.getLayoutPosition();
   mOnItemClickLitener.onItemClick( viewHolder.btn,pos);
   }
  });
  }
 }
 public class ViewHolder extends RecyclerView.ViewHolder //我们需要inflate的item布局需要传入
 {
  Button btn;
  public ViewHolder(View arg0)
  {
  super(arg0);
  btn = (Button) arg0.findViewById(R.id.btn);
  }
 }
 }
//在activity加载自己的布局
public class GallarRecyActivity extends AppCompatActivity {
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 EasyLayout easyLayout = new EasyLayout(this);
 setContentView(easyLayout);
 }
}

easy_item.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="horizontal" android:layout_width="match_parent"
 android:layout_height="match_parent">
 <Button
 android:id="@+id/btn"
 android:layout_width="320dp"
 android:layout_height="430dp" />
</LinearLayout>

6.源码及apk

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Android应用架构思想分析

    算算日子,工作刚好三年了.这篇开始,鄙人就要向着各种以前想起来就头大的方向努力前进了.作为在Android应用层搬砖多年的民工,首篇我想谈谈自己对架构思想的一些看法.如有不妥,还请拍砖. 盖楼的故事(虚构) 有一块地,两个区域,开发商分别让两个包工头负责开发. 包工头A办事干净利落,甩开膀子就开工了.为了省钱雇了一个全能的工人,他既要去采购盖房的材料,又要用这些材料盖房子.起初底层屋子结构简单,还能应付得来,到了后面复杂的设计需求时,忙的不可开交,经常精疲力尽,阻断了盖房子的进程,使得老板很是不

  • 详解Android Studio中Git的配置及协同开发

    一. Android Stutio配置git setting–>Version Control–>Git–>Path to Git executable中选择git.exe的位置,这个Stutio一般会默认配置好: 配置完路径后点击后面的Test按钮,出现下面提示框则表示配置成功: 二. 将项目分享到github 1. 设置github账号密码 打开Setting–>Version Control–>GitHub,填写完账号密码后,点击Test测试,如果连接成功会弹出如下提示

  • Android快递物流信息布局开发

    本文实例为大家分享了Android快递物流信息布局展示的具体代码,供大家参考,具体内容如下 1. 思路介绍 效果图: 思路: 就一个ListView,每个item就是一条物流信息.然后每个item,分为左和右两边,左边是一个进度条的风格,右边是物流文字,适配器里面判断item,position为0 就设置为绿色,其他position就设置为灰色就行了. 2. 代码 item的布局 <?xml version="1.0" encoding="utf-8"?>

  • Android 键盘开发知识点总结

    先废话一下,说说开发键盘的原因:像理财产品.银行等app客户端登录时,尤其是要输入密码时,会屏蔽掉系统默认输入法,改为自己的输入法!这个是考虑安全,以及防止被输入法软件记录密码等问题!所以,安全性极高的app都会要求密码等都用自己的输入法,这就有开发的需求 了! 言归正传:开发这种软件盘,从什么地方开始着手呢? 步骤1: 先看Android给我们提供的Demo 关于软键盘的Demo,在以下目录中能找到: ..\samples\android-22\legacy\SoftKeyboard 步骤二:

  • 30条android项目开发技巧与经验总结

    1.如果是阅读型文本(例如一篇文章),不需要固定大小的,textSize可以使用sp:如果是展示型文本(例如按钮中的文本),其大小受到限制的,textSize可以使用dp. 2.使用json用作网络数据传输时,应该使用String字段取代int字段. 3.按照现在正常密度比(系统的densityDPI根据分辨率和屏幕尺寸为正常的120.160.240.320.480.640时)9:16的安卓机其尺寸为(360dp*540dp).UI有时会根据iPhone机型使用750px*1334px作图,而按

  • Android组件化开发路由的设计实践

    调研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技术 编译时注解,个人想法是一口吃不成胖子,先做个比较实用的. VpRouter路由框架主要应用于组件化开发中 设计目的 解耦 跨模块跳转 方便服务器配置schema,实现动态配置跳转目标 对外部提供远程访问的功能,实现跨应用调用响应 主要功能点 支持intent,http,schema三种跳转 路由表支持xml配置,可自定义,支持多路径 有拦截器 同时支持反射和隐式意图 支持结果回调 支持参数传递 链

  • Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码

    本文讲述了Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码.分享给大家供大家参考,具体如下: 1.先贴出自己的效果图(可横向滚动,并响应item点击事件): 2.关于点击事件的实现细节 核心:使用接口回调 在adapter中自己定义了个接口,然后在onBindViewHolder中去为holder.itemView去设置相应的监听最后回调我们设置的监听. class HomeAdapter extends RecyclerView.Adapter

  • Android TV开发:实现3D仿Gallery效果的实例代码

    本文讲述了Android TV开发:实现3D仿Gallery效果的实例代码.分享给大家供大家参考,具体如下: 1.实现效果: 滚动翻页+ 页面点击+页码指示器+焦点控制 2.实现这个效果之前必须要了解 Android高级图片滚动控件实现3D版图片轮播器这篇文章,我是基于他的代码进行修改的,主要为了移植到电视上做了按键事件和焦点控制. 3.具体代码: public class Image3DSwitchView extends LinearLayout { private int currentP

  • Android 中ListView的Item点击事件失效的快速解决方法

    在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布局和自定义adapter了,一般是继承于BaseAdapter,示例代码见下方.写ListView的点击事件时OnItemClickListener,onItemClick方法没有执行,导致ListView中Item条目点击事件失效,而Item中的View点击事件可以在getView方法中进行处理.导致整个Item点击失效的原因多半是由于在[你自己定义的Item中存在诸

  • Android编程开发中ListView的常见用法分析

    本文实例讲述了Android编程开发中ListView的常见用法.分享给大家供大家参考,具体如下: 一.ListView的使用步骤 ListView的使用通常有以下三个要素: (1)ListView中每个条目的布局; (2)填充进入ListView中的内容; (3)将内容与页面进行整合的Adapter. 因此,使用ListView也通常有以下三个步骤: (1)创建ListView条目的布局文件(或使用Android SDK提供的布局); (2)创建填充进入ListView中的内容,如字符串.图片

  • 浅析Android企业级开发数据绑定技术

    这篇文章通过发文的方式让大家知道什么是数据绑定,以及为什么要用数据绑定等问题,有助于大家理解Android企业级开发数据绑定技术. 首先要了解什么是数据绑定?为什么要用数据绑定?怎么用数据绑定? 语法的使用 简单例子,数据绑定textview控件,一般情况下我们都是些一个布局文件,然后布局文件里放一些textview,然后通过Activity来findviewbyid来获取id,然后对象.setText("").现在我们学了数据绑定,就可以不用之前的方法了. 把库加载进来:因为这个东西

  • Android中点击事件的四种写法详解

    Android中点击事件的四种写法 使用内部类实现点击事件 使用匿名内部类实现点击事件 让MainActivity实现View.OnClickListener接口 通过布局文件中控件的属性 第一种方法:使用内部类 基本步骤如下: 1. 新建一个MyOnClickListener类并实现View.OnClickListener接口 2. 重写View.OnClickListener接口中的OnClick(View view)方法 3. 给Button绑定一个监听器,并监听一个点击事件 示例代码如下

  • Android点击事件派发机制源码分析

    概述 一直想写篇关于Android事件派发机制的文章,却一直没写,这两天刚好是周末,有时间了,想想写一篇吧,不然总是只停留在会用的层次上但是无法了解其内部机制.我用的是4.4源码,打开看看,挺复杂的,尤其是事件是怎么从Activity派发出来的,太费解了.了解Windows消息机制的人会发现,觉得Android的事件派发机制和Windows的消息派发机制挺像的,其实这是一种典型的消息"冒泡"机制,很多平台采用这个机制,消息最先到达最底层View,然后它先进行判断是不是它所需要的,否则就

  • Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码

    Android可以在所有应用上方添加View,就是给WindowManager添加一个View,在创建的View的时候可以给这个View设置LayoutParams(android.view.WindowManager.LayoutParams.LayoutParams())属性,默认是屏蔽View区域以外的所有点击事件,即在显示View的时候,屏幕的其它区域都不可点击,包括菜单和返回键等. 当给LayoutParams设置合适的flag后,其它区域就可以响应点击了. 示例代码: /** * 创

  • Android移动开发recycleView的页面点击跳转设计实现

    目录 一.目的 二.具体代码和页面介绍 三.仓库代码 一.目的 回顾前两次的过程和效果以及本次任务以及最终效果视图: (1)第一次实现界面设计和界面跳转,示例如下: (2)第二次是在页面中设计出自己喜欢的布局并加以实现,我实现的是瀑布流式的布局,如下: (3)第三次就是这次的任务:Activity页面跳转(实现recycleView的页面进行点击跳转),效果如下: 二.具体代码和页面介绍 1.编辑详情页面 即点击后的界面的样式,代码以及样式图如下: <?xml version="1.0&q

  • Flutter TV Android端开发技巧详细教程

    目录 前言 开发思路 先上效果 开发细节 使用RawKeyboardListener Provider层对事件进行处理 注意 总结 文件参考 TV keyCode详解 前言 最近公司有了新的业务,把现有Flutter Android项目应用到TV上去,这不,Asscre的活就来了. 本文详细说明Flutter for TV的两种实现方式,能力有限,不足之处欢迎指点,哈哈哈 开发思路 在开发之前,我们先设定一下我们的思路. 即,如何对原有程序代码侵入式最小.性能最佳.可玩性更高做出设定. 那么,通

随机推荐