美文网首页
Android学习笔记——ListView、AdapterVie

Android学习笔记——ListView、AdapterVie

作者: Jotyy | 来源:发表于2017-12-06 16:08 被阅读0次

    ——ListView、AdapterView、RecyclerView基础

    AdapterView介绍

    Adapter本身是一个抽象类,AdapterView及其子类的继承关系如下图:
    [图片上传失败...(image-3976aa-1512547750786)]

    AdapterView具有以下特征:

    • AdapterView继承自ViewGroup,本质上是一个容器
    • AdapterView可以包含多个列表项,并将多个列表项以合适的形式展示
    • AdapterView显示的列表项内容由Adapter(适配器)提供
    • 它派生的子类在用法上也基本相似,只是在显示上有一定的区别,因此把他们也归为一类
    • 由AdapterView直接派生的有三个类

    AbsListView AbsSpinner AdapterViewAnimator
    都是抽象类,所以我们使用最多的就是图中第四行及一下的子类。

    ListView介绍
    1、什么是ListView

    即列表视图,是Android开发中一种常用的视图组件

    2、ListView的作用
    • 将所要展示的数据集合起来
    • 以列表的形式展示到用户界面上
    3、关于Adapter

    定义:适配器
    作用:作为View和数据之间的桥梁

    由于ListView和所要展现的数据是分开的,不直接接触,所以Adapter的作用就是把数据映射到ListView上,作为中介的作用,如下图。
    [图片上传失败...(image-f0623f-1512547750786)]

    4、ListView的工作原理
    • ListView、GridView、Spinner等AdapterView都只是容器,主要用于装载需要显示的数据并显示,而Adapter负责提供容器的内容。

    即AdapterView负责采用合适的方式显示Adapter提供的内容

    • 在运行时,当需要显示数据时,ListView会针对数据项向Adapter取出数据,从而加载到界面上。

    试想:如果把所有数据集合的信息都加载到View上,如果ListView要为每个数据都创建一个视图,那么会占用非常多的内存。

    • 由此,ListView不会为每一个数据都创建一个视图,为了节省空间和时间,Android采用了一个叫Recycler的组件。

    工作原理:当屏幕需要显示x个item时,那么ListView只会创建x+1个视图,当第一个item离开屏幕时,这个item的view就会被哪来用于显示下一个item的内容。

    5、ListView的使用
    • 生成方式
      生成列表视图(ListView)的方式主要有两种:
      a.直接用ListView进行创建
      b.让Activity继承ListActivity
    • xml文件配置信息
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFE1FF"
        android:orientation="vertical">
        <ListView
            android:id="+@id/listview1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
    

    AbsListView的常用属性和相关方法:

    • android:choiceMode 列表的选择行为
    • android:drawSelectorOnTop 该属性为true,则选中列表项会显示在上方
    • android:listSelector 为点击到Item设置图片
    • android:fastScrollEnables 设置是否允许快速滚动
    • android:scrollingCache 滚动时是否使用缓存
    • android:stackFromBottom 设置是否从地段开始排列列表项
    • android:transcriptMode 指定列表添加新的选项时,是否自动滑动到地步,显示新的选项

    ListView提供的xml属性:

    • android:divider 设置List列表项的分割条(可用颜色或图片分割)
    • android:dividerHeight 设置分割条的高度
    • android:background 设置列表的背景
    • android:entries 指定一个数组资源,Android将根据该数组资源来生成ListView
    • android:footerDividerEnabled 如果设置成false,则不再footerView之前绘制分割条
    • android:headerDividerEnabled 如果设置成false,则不再headerView之前绘制分隔条
    Adapter介绍

    Adapter本身也是一个接口,与其子类的继承关系如下:
    [图片上传失败...(image-7e707c-1512547750786)]

    • Adapter接口派生了ListAdapter和SpinnerAdapter两个子接口

    其中ListAdapter为AbsAdapter提供列表项,SpinnerAdapter为AbsSpinner提供列表项

    • ArrayAdapter、SimpleAdapter、SimpleCursorAdapter、BaseAdapter都是常用的适配器的类

    1.ArrayAdapter:简单、易用的Adapter,用于将数组绑定为列表项的数据源,支持泛型操作
    2.SimpleAdapter:功能强大的Adapter,用于将xml中控件绑定为列表项的数组源
    3.SimpleCursorAdapter:与SimpleAdapter类似,用于绑定游标(直接从数据数组取出数据)作为列表项的数据源
    4.BaseAdapter:可自定义ListView,通用用于被扩展。扩展BaseAdapter可以对各个列表项进行最大程度的定制。

    常用适配器介绍

    ArrayAdapter
    定义:简单、易用Adapter,用于将数组绑定为列表项的数据源,支持泛型操作
    步骤:
    1、在xml文件上布局ListView

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp">
        <ListView
            android:id="@+id/list_item"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="#f00"
            android:dividerHeight="1sp"
            android:headerDividersEnabled="false">
        </ListView>
    </RelativeLayout>
    

    2、在MainActivity上定义一个链表,将所要展示的数据以存放在里面
    3、构造ArrayAdapter对象,设置适配器
    4、将ListView绑定到ArrayAdapter上,如下:

    public class MainActivity extends AppCompatActivity {
    
        private ListView listView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            listView = (ListView)findViewById(R.id.list_item);
            //定义一个链表用于存放数据
            List<String> adapterData = new ArrayList<String>();
            //存放将要显示的数据
            for(int i = 0; i<30;i++){
                adapterData.add("listitem"+i);
            }
            //创建ArratAdapter对象adpter并设置适配器
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.list_item,adapterData);
            //将ListView绑定到adapter上
            listView.setAdapter(adapter);
        }
    }
    

    缺点:ArrayAdapter较为简单易用,但每个列表项只能是TextView,功能实现局限性很大。

    SimpleAdapter
    定义:功能强大的Adapter,用于将xml中的控件绑定作为列表项的数据源
    特点:可对每个列表项进行定制,自定义布局,能满足大多数开发的需求场景,灵活性较大

    步骤:
    1、在xml文件上布局实现ListView

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp">
        <ListView
            android:id="@+id/list_item"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="#f00"
            android:dividerHeight="1sp"
            android:headerDividersEnabled="false">
        </ListView>
    </RelativeLayout>
    

    2、根据实际需求定制列表项:实现每一行xml的布局(即item布局)

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="17sp"
            android:paddingLeft="14dp"/>
        <TextView
            android:id="@+id/address"
            android:layout_below="@id/name"
            android:textSize="17sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/lowerest_wholesale"
            android:layout_toRightOf="@id/address"
            android:textSize="17sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/price"
            android:textSize="17sp"
            android:layout_below="@id/address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:id="@+id/picture"
            android:layout_alignParentRight="true"
            android:layout_width="115dp"
            android:layout_height="86dp"         />
    </RelativeLayout>
    

    3、定义一个HashMap构成的列表以键值对的方式存放数据
    4、构造SimpleAdapter对象,设置适配器
    5、将ListView绑定到SimpleAdapter上,如下:

    public class MainActivity extends AppCompatActivity {
    
        private ListView listView;
        private String[] name = new String[]{"腾讯","爱奇艺","优酷"};
        private String[] address = new String[]{"广州","成都","上海"};
        private  int[] lowerest_wholesale = new int[]{22,333,44};
        private int[] price = new int[]{11,44,22};
        private int[] picture = new int[]{
                R.drawable.ic_launcher_background,
                R.drawable.ic_launcher_foreground,
                R.drawable.ic_launcher_background
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            listView = (ListView)findViewById(R.id.list_item);
            //定义一个HahsMap构成的列表以键值对的方式存放数据
            ArrayList<HashMap<String,Object>> listItems = new ArrayList<>();
            //循环填充数据
            for(int i = 0; i<name.length;i++){
                HashMap<String,Object> map = new HashMap<>();
                map.put("name",name[i]);
                map.put("address",address[i]);
                map.put("lowerest_wholesale",lowerest_wholesale[i]);
                map.put("price",price[i]);
                map.put("picture",picture[i]);
                listItems.add(map);
            }
    
            //构造SimpleAdapter对象,设置适配器
            SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,
                    listItems,
                    R.layout.list_items,
                    new String[]{"name","address","lowerest_wholesale","price","picture"},
                    new int[]{R.id.name,R.id.address,R.id.lowerest_wholesale,R.id.price,R.id.picture}
                    );
            listView.setAdapter(mSimpleAdapter);
        }
    }
    

    BaseAdapter
    定义:可自定义ListView,通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大程度的定制。
    使用步骤:
    1、定义主xml布局
    2、根据需要定义ListView每一行的xml布局
    3、定义一个Adapter类继承BaseAdapter,重写里面的方法。
    4、定义一个HashMap结构的列表,将数据以键值对的方式存放其中
    5、构造Adapter对象,设置适配器。
    6、将ListView绑定到Adapter上。
    详细步骤如下:
    定于xml布局:略
    根据需要定义ListView每一行xml布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:layout_alignParentRight="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/ItemImage"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮"
            android:id="@+id/ItemBottom"
            android:focusable="false"
            android:layout_toLeftOf="@+id/ItemImage" />
        <TextView android:id="@+id/ItemTitle"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:textSize="20sp"/>
        <TextView android:id="@+id/ItemText"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:layout_below="@+id/ItemTitle"/>
    </RelativeLayout>
    

    定义一个Adapter类继承BaseAdapter:

    public class MyAdapter extends BaseAdapter {
        //获得一个LayoutInflater来导入布局
        private Context mContext;
        private ArrayList<HashMap<String,Object>> arrayList;
    
        //构造函数
        public MyAdapter(Context context, ArrayList<HashMap<String,Object>> arrayList) {
            this.mContext = context;
            this.arrayList = arrayList;
        }
    
        @Override
        public int getCount() {
            return arrayList.size();
        }
    
        @Override
        public Object getItem(int position) {
            return arrayList.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if(convertView == null){
                holder = new ViewHolder();
                convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item,null);
                holder.img = (ImageView) convertView.findViewById(R.id.ItemImage);
                holder.title = (TextView)convertView.findViewById(R.id.ItemTitle);
                holder.text=(TextView)convertView.findViewById(R.id.ItemText);
                holder.btn= (Button) convertView.findViewById(R.id.ItemBottom);
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder)convertView.getTag();
            }
    
            holder.img.setImageResource((Integer) arrayList.get(position).get("ImageItem"));
            holder.title.setText((String) arrayList.get(position).get("title"));
            holder.text.setText((String) arrayList.get(position).get("text"));
            holder.btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    System.out.println("你点击了选项"+position);
                }
            });
            return convertView;
        }
    
        //声明一个外部静态类
        class ViewHolder{
            public ImageView img;
            public TextView title;
            public TextView text;
            public Button btn;
        }
    }
    

    接下来是MainActivity中实现:

    public class MainActivity extends AppCompatActivity {
    
        private ListView listView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            listView = (ListView)findViewById(R.id.list_item);
            //定义一个以HashMap为内容的动态数组
            ArrayList<HashMap<String,Object>> arrayList = new ArrayList<HashMap<String, Object>>();
    
            for(int i=0;i<88;i++){
                HashMap<String,Object> map = new HashMap<String, Object>();
                map.put("ImageItem",R.mipmap.ic_launcher);
                map.put("title",i+"行");
                map.put("text",i+"内容");
                arrayList.add(map);
            }
    
            MyAdapter adapter = new MyAdapter(this,arrayList);
            listView.setAdapter(adapter);
    
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    System.out.println("Ni点击了第"+position);
                }
            });
        }
    }
    
    RecyclerView介绍

    定义:RecyclerView是Goolgle推出来代替ListView组件的。是一个强大的滑动控件。

    RecyclerView强制使用了ViewHolder,直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item。
    工作原理:当屏幕要显示x个item时,那么ListView只会创建x+1个视图,当第一个item离开屏幕时,此item的view就会被哪来重用(用于显示下一个item(即第x+1个)的内容)。
    工作原理示例:假如屏幕只能显示7个item,那么ListView只会创建(7+1)个item的视图。当第一个item离开屏幕时,此item的view就会被哪来重用(用于显示第8个item的内容)。原理如下图:
    [图片上传失败...(image-eed3bf-1512547750786)]
    RecyclerView重要概念

    • RecyclerView.Adapter
      和ListView一样,Recycler一样需要适配器,而且这个适配器强制要求了我们必须要用ViewHolder,让性能得到优化,而且getView方法不需要自己写,我们只需要写好ViewHolder,View的复用已经封装好了。
    • LayoutManager
      管理布局,设置为LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager可以轻易的实现ListView,GridView以及流式布局的列表效果。它还可以管理滚动和循环利用。
    • ItemAnimator
      这个类可以实现增删动画,而且不想设置的话默认效果已经很好了

    RecyclerView的优缺点
    优点:

    • item复用性高
      把ViewjHolder的实现封装起来,规范了ViewHolder,把item的view写入ViewHolder中,可以通过复用ViewHolder来实现view的复用。
    • 灵活、可定制化高、可拓展性高
      整体上看RecyclerView架构,提供了一种插拔式体验:高度的解耦,异常的灵活
    • 控制其显示的方式:通过布局管理器LayoutManager
    • 控制Item间的间隔(可绘制):通过ItemDecoration
    • 控制Item增删的动画:通过ItemAnimator
    mRecyclerView = findView(R.id.id_recyclerview);
    //设置布局管理器
    mRecyclerView.setLayoutManager(layout);
    //设置adapter
    mRecyclerView.setAdapter(adapter);
    //设置Item增加、移除动画
    mRecycler.setItemAnimator(new DefaultAnimator());
    //添加分割线
    mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.HORIZONTAL_LIST))
    

    缺点:
    RecyclerView实现控制电机、长按事件比较麻烦,需要自己写。

    RecyclerView使用实例
    • 使用步骤
      1、定义主xml布局
      2、根据需要定义RecyclerView每行所实现的xml布局
      3、定义一个Adapter类继承RecyclerView.Adapter,重写 里面的方法
      4、定义一个HashMap构成的列表,将数据以键值对的方式存放在里面
      5、构造Adapter对象,设置适配器
      6、将RecyclerView绑定到Adapter上
      具体步骤:
    • 定义主xml布局:
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/my_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="horizontal"
            />
    </RelativeLayout>
    
    • 定义每一行的显示item内容
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:layout_alignParentRight="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/ItemImage"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="New Text"
                android:id="@+id/Itemtitle" />
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="New Text"
                android:id="@+id/Itemtext"
                android:layout_below="@+id/Itemtitle"/>
        </RelativeLayout>
    </LinearLayout>
    
    • 定义一个Adapter类继承RecyclerView.Adapter
    package com.shieda.app.recyclerview;
    
    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    
    /**
     * Created by Lwj on 2017/12/5.
     */
    
    public class MyAdapter extends RecyclerView.Adapter {
        private LayoutInflater inflater;
        private ArrayList<HashMap<String,Object>> listItem;
        private MyItemClickListener myItemClickListener;
    
        public MyAdapter(Context context, ArrayList<HashMap<String, Object>> listItem) {
            inflater = LayoutInflater.from(context);
            this.listItem = listItem;
        }
    
        //定义ViewHolder
        class ViewHolder extends RecyclerView.ViewHolder{
            private TextView Title,Text;
            private ImageView ima;
    
            public ViewHolder(View root) {
                super(root);
                Title = (TextView) root.findViewById(R.id.Itemtitle);
                Text = (TextView) root.findViewById(R.id.Itemtext);
                ima = (ImageView) root.findViewById(R.id.ItemImage);
                root.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(myItemClickListener != null){
                            myItemClickListener.onItemClick(v,getPosition());
                        }
                    }//监听到点击就回调MainActivity的onItemClick函数
                });
            }
    
            public TextView getTitle(){
                return Title;
            }
    
            public TextView getText(){
                return Text;
            }
    
            public ImageView getIma(){
                return ima;
            }
        }
    
        //绑定ViewHolder到Item布局
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ViewHolder(inflater.inflate(R.layout.list_item,null));
        }
    
        //绑定数据到ViewHolder中
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            ViewHolder viewHolder = (ViewHolder) holder;
            viewHolder.Title.setText((String) listItem.get(position).get("title"));
            viewHolder.Text.setText((String) listItem.get(position).get("text"));
            viewHolder.ima.setImageResource((Integer) listItem.get(position).get("ItemImages"));
        }
    
        @Override
        public int getItemCount() {
            return listItem.size();
        }
    
        public void setOnItemClickListener(MyItemClickListener listener){
            myItemClickListener = listener;
        }
    }
    
    • 实现分割线的类
    public class DividerItemDecoration extends RecyclerView.ItemDecoration {
        /*
          * RecyclerView的布局方向,默认先赋值
          * 为纵向布局
          * RecyclerView 布局可横向,也可纵向
          * 横向和纵向对应的分割想画法不一样
          * */
        private int mOrientation = LinearLayoutManager.VERTICAL ;
    
        /**
         * item之间分割线的size,默认为1
         */
        private int mItemSize = 1 ;
    
        /**
         * 绘制item分割线的画笔,和设置其属性
         * 来绘制个性分割线
         */
        private Paint mPaint ;
    
        /**
         * 构造方法传入布局方向,不可不传
         * @param context
         * @param orientation
         */
        public DividerItemDecoration(Context context, int orientation) {
            this.mOrientation = orientation;
            if(orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL){
                throw new IllegalArgumentException("请传入正确的参数") ;
            }
            mItemSize = (int) TypedValue.applyDimension(mItemSize, TypedValue.COMPLEX_UNIT_DIP,context.getResources().getDisplayMetrics());
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG) ;
            mPaint.setColor(Color.BLUE);
             /*设置填充*/
            mPaint.setStyle(Paint.Style.FILL);
        }
    
        @Override
        public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
            if(mOrientation == LinearLayoutManager.VERTICAL){
                drawVertical(c,parent) ;
            }else {
                drawHorizontal(c,parent) ;
            }
        }
    
        /**
         * 绘制纵向 item 分割线
         * @param canvas
         * @param parent
         */
        private void drawVertical(Canvas canvas, RecyclerView parent){
            final int left = parent.getPaddingLeft() ;
            final int right = parent.getMeasuredWidth() - parent.getPaddingRight() ;
            final int childSize = parent.getChildCount() ;
            for(int i = 0 ; i < childSize ; i ++){
                final View child = parent.getChildAt( i ) ;
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                final int top = child.getBottom() + layoutParams.bottomMargin ;
                final int bottom = top + mItemSize ;
                canvas.drawRect(left,top,right,bottom,mPaint);
            }
        }
    
        /**
         * 绘制横向 item 分割线
         * @param canvas
         * @param parent
         */
        private void drawHorizontal(Canvas canvas, RecyclerView parent){
            final int top = parent.getPaddingTop() ;
            final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom() ;
            final int childSize = parent.getChildCount() ;
            for(int i = 0 ; i < childSize ; i ++){
                final View child = parent.getChildAt( i ) ;
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                final int left = child.getRight() + layoutParams.rightMargin ;
                final int right = left + mItemSize ;
                canvas.drawRect(left,top,right,bottom,mPaint);
            }
        }
    
        /**
         * 设置item分割线的size
         * @param outRect
         * @param view
         * @param parent
         * @param state
         */
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            if(mOrientation == LinearLayoutManager.VERTICAL){
                outRect.set(0,0,0,mItemSize);
            }else {
                outRect.set(0,0,mItemSize,0);
            }
        }
    }
    
    • 点击事件的接口
    public interface MyItemClickListener {
        public void onItemClick(View view, int position);
    }
    
    
    • 在MainActivity实现的步骤
    public class MainActivity extends AppCompatActivity implements MyItemClickListener {
    
        private RecyclerView Rv;
        private ArrayList<HashMap<String,Object>> listItem;
        private MyAdapter myAdapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
            initView();
    
        }
    
        public void initData(){
            listItem = new ArrayList<HashMap<String, Object>>();/*在数组中存放数据*/
            for (int i = 0; i < 100; i++) {
                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put("title", "第" + i + "行");
                map.put("text", "这是第" + i + "行");
                map.put("ItemImages",R.mipmap.ic_launcher);
                listItem.add(map);
            }
        }
        public void initView(){
            LinearLayoutManager layoutManager = new LinearLayoutManager(this);//使用线性布局
    //        GridLayoutManager layoutManager = new GridLayoutManager(this,3);//使用GridLayout布局
            Rv = (RecyclerView) findViewById(R.id.my_recycler_view);
    
            myAdapter = new MyAdapter(this,listItem);
            myAdapter.setOnItemClickListener(this);
            Rv.addItemDecoration(new DividerItemDecoration(this, layoutManager.getOrientation()));//设置分割线
    //        Rv.addItemDecoration(new DividerItemDecoration(this, R.drawable.list_divider)); //设置分割线,这个是用自己画的
            Rv.setLayoutManager(layoutManager);
            Rv.setHasFixedSize(true);
            Rv.setAdapter(myAdapter);
    
        }
    
        @Override
        public void onItemClick(View view, int postion) {//点击事件的回调函数
            System.out.println("点击了第"+postion+"行");
            Toast.makeText(this, (String)listItem.get(postion).get("text"), Toast.LENGTH_SHORT).show();
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Android学习笔记——ListView、AdapterVie

          本文链接:https://www.haomeiwen.com/subject/cuhlixtx.html