android TV开发:使用RecycleView实现横向的Listview并响应点击事件
2016-10-25 20:38
633 查看
1.先贴出自己的效果图(可横向滚动,并响应item点击事件):
2.关于点击事件的实现细节:参考鸿洋老师的博客
核心:使用接口回调
在adapter中自己定义了个接口,然后在onBindViewHolder中去为holder.itemView去设置相应的监听最后回调我们设置的监听。
3.实现横向效果
核心: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.代码实现:
6.源码及apk
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 TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码
- 利用RecycleView实现类似ListView的Item点击,长按等操作事件以及点击后每一项在添加一个列表
- iOS开发-UIImageView响应点击事件
- iOS -实现imageView中的button响应点击事件的方法
- react native中使用react-native-viewpager实现的商品展示添加点击事件
- iOS开发中两层view上的button不响应点击事件
- 李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView
- 关于listfragment中使用listview的点击事件不响应
- Android开发本地及网络Mp3音乐播放器(十六)歌词显示及滚动事件实现、ViewPager使用
- Android中使用回调接口实现自定义view的点击事件
- Android开发使用自定义view实现ListView下拉的视差特效功能
- 使用SpanableString实现textview部分字体点击事件(不同颜色)
- iPhone开发之UIScrollView滚动组件的使用——纯代码实现图形的横向与纵向滚动
- 初学者对通讯录软件开发的整体把握与分块实现———点击menu按钮的响应事件
- RecycleView如何实现item的点击事件
- 开发笔记:解决安卓GestureOverlayView手势和ListView点击事件、文本框获取焦点冲突的问题
- ListView使用自定义适配器的情况下实现适配器的文本和图标控件点击事件执行Activity界面中的方法
- iOS -实现imageView中的button响应点击事件的方法
- listview中textview响应部分文本点击事件
- Android开发本地及网络Mp3音乐播放器(十六)歌词显示及滚动事件实现、ViewPager使用