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 获取最新文章更新,欢迎一起交流学习!
    这里写图片描述

  • 相关阅读:
    金蝶,用友,浪潮erp介绍
    Javascript(Prototype)继承机制的设计思想
    IEnumerator和IEnumerable的关系
    MVC实用构架实战(一)——使用MEF实现IOC
    sql 数字转换为字符串补0
    scrum角色及其职责介绍
    NPOI 名称空间介绍
    双循环排序与冒泡排序的区别
    Silverlight 应用 WCF RIA Services 在 IIS6 部署问题总结
    PD15 数据库反向工程
  • 原文地址:https://www.cnblogs.com/jzmanu/p/10284786.html
Copyright © 2011-2022 走看看