zoukankan      html  css  js  c++  java
  • RecyclerView 的 Item 的单击事件

    RecyclerView 的每个Item的点击事件并没有像 ListView 一样封装在组件中,需要 Item 的单击事件时就需要自己去实现,在 Adapter 中为RecyclerView 添加单击事件参考如下:

    RecyclerView的使用方法请参考:RecyclerView的简单使用

    第一步:

    在 RecyclerView 的 Adapyer 中定义单击事件的回调接口:

    /**
     * 定义 RecyclerView 选项单击事件的回调接口
     */
    public interface OnItemClickListener{
        //参数(父组件,当前单击的View,单击的View的位置,数据)
        void onItemClick(RecyclerView parent,View view, int position, String data);
    }

    第二步:

    在RecyclerView的Adapyer中声明该接口,并提供setter方法:

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

    第三步:

    在RecyclerView的Adapyer类实现View.OnClickListener接口,并重写onClick(View view)方法,然后设置给接口的事件监听:

    public class RvAdapter1 extends RecyclerView.Adapter<RvAdapter1.DataViewHolder> implements View.OnClickListener{
        ...
        view.setOnClickListener(this);//设置监听器
        ...
        @Override
        public void onClick(View view) {
            //根据RecyclerView获得当前View的位置
            int position = recyclerView.getChildAdapterPosition(view);
            //程序执行到此,会去执行具体实现的onItemClick()方法
            if (onItemClickListener!=null){
                onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));
            }
        }
        ...
    }

    第四步:

    在MainActivity中通过Adapter设置每个Item的单击事件:

    adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {
        @Override
        public void onItemClick(RecyclerView parent, View view, int position, String data) {
            Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
        }
    });

    参考代码

    Adapter
    /**
     * Created by jzman on 2017/5/13 0013.
     * RecycleView的Adapter
     */
    public class RvAdapter1 extends RecyclerView.Adapter<RvAdapter1.DataViewHolder> implements View.OnClickListener{
        private Context mContext;
        private RecyclerView recyclerView;
        private ArrayList<String> mList;
    
        public RvAdapter1() {}
    
        public RvAdapter1(Context mContext, ArrayList<String> mList) {
            this.mContext = mContext;
            this.mList = mList;
        }
    
        /**
         * 用于创建ViewHolder
         * @param parent
         * @param viewType
         * @return
         */
        @Override
        public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item,null);
            view.setOnClickListener(this);
            //使用代码设置宽高(xml布局设置无效时)
            view.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
            DataViewHolder holder = new DataViewHolder(view);
            return holder;
        }
    
        /**
         * 绑定数据
         * @param holder
         * @param position
         */
        @Override
        public void onBindViewHolder(DataViewHolder holder, int position) {
            holder.tv_data.setText(mList.get(position));
        }
    
        /**
         * 选项总数
         * @return
         */
        @Override
        public int getItemCount() {
            return mList.size();
        }
    
        @Override
        public void onClick(View view) {
            //根据RecyclerView获得当前View的位置
            int position = recyclerView.getChildAdapterPosition(view);
            //程序执行到此,会去执行具体实现的onItemClick()方法
            if (onItemClickListener!=null){
                onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));
            }
        }
    
        /**
         * 创建ViewHolder
         */
        public static class DataViewHolder extends RecyclerView.ViewHolder{
            TextView tv_data;
            public DataViewHolder(View itemView) {
                super(itemView);
                tv_data = (TextView) itemView.findViewById(R.id.tv_recycle);
            }
        }
    
        private OnItemClickListener onItemClickListener;
        public void setOnItemClickListener(OnItemClickListener onItemClickListener){
            this.onItemClickListener = onItemClickListener;
        }
    
        /**
         * 定义RecyclerView选项单击事件的回调接口
         */
        public interface OnItemClickListener{
            //参数(父组件,当前单击的View,单击的View的位置,数据)
            void onItemClick(RecyclerView parent,View view, int position, String data);
        }
        /**
         *   将RecycleView附加到Adapter上
         */
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
            this.recyclerView= recyclerView;
        }
        /**
         *   将RecycleView从Adapter解除
         */
        @Override
        public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
            super.onDetachedFromRecyclerView(recyclerView);
            this.recyclerView = null;
        }
    }
    MainActivity
    /**
     * Created by jzman on 2017/5/13 0013.
     */
    public class MainActivity extends AppCompatActivity {
        private RecyclerView rv;
        RvAdapter1 adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            rv = (RecyclerView) findViewById(R.id.rv);
            //设置布局管理器
    //        rv.setLayoutManager(new LinearLayoutManager(this));//线性
            rv.setLayoutManager(new GridLayoutManager(this,4));//线性
    //        rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//线性
            adapter = new RvAdapter1(this,initData());
            adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {
                @Override
                public void onItemClick(RecyclerView parent, View view, int position, String data) {
                    Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
                }
            });
    
            rv.setAdapter(adapter);
        }
        public static ArrayList<String> initData(){
            ArrayList<String> arrayList = new ArrayList<>();
            for (int i=0;i<50;i++){
                arrayList.add("第"+i+"条数据");
            }
            return arrayList;
        }
    }

    显示效果

    image

    可以关注微信公众号:jzman-blog 获取最新文章更新,欢迎一起交流学习!
    这里写图片描述

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/jzmanu/p/10284786.html
Copyright © 2011-2022 走看看