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


                
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值