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

 更新时间:2018年05月15日 10:23:45   作者:meetings  
这篇文章主要介绍了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

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

相关文章

  • Android实战教程第八篇之短信备份

    Android实战教程第八篇之短信备份

    这篇文章主要为大家详细介绍了Android实战教程第八篇之短信备份的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Flutter实现Android滚动悬浮效果过程

    Flutter实现Android滚动悬浮效果过程

    这篇文章主要介绍了Flutter实现Android滚动悬浮效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Android studio编写简单的手电筒APP

    Android studio编写简单的手电筒APP

    一个简单的APP控制的手电筒代码,android studio编写一个手电筒app,调用手机的闪光等实现手电筒的功能,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android编程中@id和@+id的区别分析

    Android编程中@id和@+id的区别分析

    这篇文章主要介绍了Android编程中@id和@+id的区别,较为详细的分析讲述了Android中资源引入的原理及使用@id和@+id引入资源的具体用法,总结了二者的区别,需要的朋友可以参考下
    2016-01-01
  • Flutter手势密码的实现示例(附demo)

    Flutter手势密码的实现示例(附demo)

    本文主要介绍了Flutter手势密码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Android 使用maven publish插件发布产物(aar)流程实践

    Android 使用maven publish插件发布产物(aar)流程实践

    这篇文章主要介绍了Android 使用maven publish插件发布产物(aar)流程实践,Android Gradle插件根据项目gradle中应用不同的插件类型在编译组装后会生成不同的产物,具体相关介绍,需要的小伙伴可以参考一下
    2022-09-09
  • Android应用的LinearLayout中嵌套RelativeLayout的布局用法

    Android应用的LinearLayout中嵌套RelativeLayout的布局用法

    这篇文章主要介绍了Android应用的LinearLayout中嵌套RelativeLayout的布局用法,文后还给出了线性布局中一些组件位置的调试经验,需要的朋友可以参考下
    2016-04-04
  • Android自定义UI手势密码改进版源码下载

    Android自定义UI手势密码改进版源码下载

    这篇文章主要介绍了Android自定义UI手势密码改进版,为大家提供了手势密码源码下载,,具有一定的实用性,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Android SQLite详解及示例代码

    Android SQLite详解及示例代码

    本文主要讲解Android SQLite,这里对数据库SQLite 做了详细的知识资料整理,并附示例代码和实现效果图,有需要的小伙伴可以参考下
    2016-08-08
  • 详解android 人脸检测你一定会遇到的坑

    详解android 人脸检测你一定会遇到的坑

    这篇文章主要介绍了详解android 人脸检测你一定会遇到的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论