RecyclerView实现简单思路梳理(陆续完善梳理中)

1、导入RecyclerView依赖
2、Activity的布局文件(在xml文件用使用RecyclerView控件)
3、Item条目的布局文件(在xml文件中创建item条目布局)
4、在Activity中设置RecyclerView
onCreate方法中
①给activity设置一个layout布局
②准备数据
③找到RecyclerView控件
④设置LayoutManager
⑤设置适配器adapter
5、适配器(Adapter)代码
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.MyViewHolder>{};这个方法一顿点就OK了。
每个Adapter都必须继承自RecyclerView.Adapter.并实现三个方法:
① onCreateViewHolder:创建ViewHolder(条目的界面)并返回。
② onBindViewHolder:将数据放入ViewHolder中
③getItemCount:返回展示条目的个数,直接返回数据源(一般为一个List)的大小就行
④ViewHolder类:是一个内部类 作用 :findViewById找到条目控件 和 设置数据

1、在build.gradle中添加依赖库

implementation 'androidx.recyclerview:recyclerview:1.1.0'

2、activity布局文件(例activity_main.xml文件)

<?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"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

3、Item条目的布局文件(例item_list_view.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="90dp">

    <ImageView
        android:id="@+id/list_view_icon"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_margin="10dp"
        android:scaleType="fitXY"
        android:src="@mipmap/pic_01" />

    <TextView
        android:id="@+id/list_view_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="20dp"
        android:layout_toRightOf="@id/list_view_icon"
        android:text="我是标题"
        android:textSize="30sp" />
</RelativeLayout>

4、在Activity中设置RecyclerLayout(MainActivity文件)

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private RecyclerView mlist;
    private List<ItemBean> mData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//给activity设置一个layout布局
        initData();//准备数据(模拟后台数据)
        mlist = this.findViewById(R.id.recycler_view); //找到RecyclerView控件
        mlist.setLayoutManager(new LinearLayoutManager(this)); //设置LinearLayoutManager
        //mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));//设置GridLayoutManager
        //mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));//设置StaggeredGridLayoutManager
        ListViewAdapter adapter = new ListViewAdapter(mData);
        mlist.setAdapter(adapter); //设置adapter到RecyclerView中
    }
    private void initData() {
        mData = new ArrayList<>();
        for (int i = 0; i < Datas.icons.length; i++) {
            ItemBean data = new ItemBean();
            data.icon = Datas.icons[i];
            data.title = "第" + i + "个条目";
            mData.add(data);
        }
    }
}

5、适配器(Adapter)代码(ListViewAdapter文件)

public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.MyViewHolder> {

    private final List<ItemBean> mData;

    //通过构造方法获取数据
    public ListViewAdapter(List<ItemBean> data) {
        this.mData = data;
    }

    /**
     * 创建ViewHolder(条目的界面)并返回
     */
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = View.inflate(parent.getContext(), R.layout.item_list_view, null);
        return new MyViewHolder(view);//MyViewHolder的入参就是条目的界面(item_view)
    }

    /**
     * 将数据放入ViewHolder中
     */
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.setData(mData.get(position));//设置数据
    }

    /**
     * 返回条目个数
     */
    @Override
    public int getItemCount() {
        if (mData != null) {
            return mData.size();
        }
        return 0;
    }

    /**
     * ViewHolder容纳了ItemView的实例。
     */
    public class MyViewHolder extends RecyclerView.ViewHolder {
        private ImageView mIcon;
        private TextView mtitle;
        
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            //findViewById找到条目控件
            mIcon = itemView.findViewById(R.id.list_view_icon);
            mtitle = itemView.findViewById(R.id.list_view_title);
        }
        public void setData(ItemBean itemBean) {
            //设置数据
            mIcon.setImageResource(itemBean.icon);
            mtitle.setText(itemBean.title);
        }
    }
}

数据准备:一般是从后台获取的数据,在这里先模拟数据。
a.实体类

public class ItemBean {
    public int id;
    public int icon;
    public String title;
}

b.对应数据

public class Datas {
    public static int[] icons = {
            R.mipmap.pic_01,
            R.mipmap.pic_02,
            R.mipmap.pic_03,
            R.mipmap.pic_04,
            R.mipmap.pic_05,
            R.mipmap.pic_06,
            R.mipmap.pic_07,
            R.mipmap.pic_08,
            R.mipmap.pic_09,
            R.mipmap.pic_10,
            R.mipmap.pic_11,
            R.mipmap.pic_12,
    };
}

模拟数据来源

其他:

CardView

有圆角背景和阴影的框架布局,继承自FrameLayout。
主要的使用场景有:在recyclerView中统一每一个item的样式;包装一个item…
Cardview依赖:

implementation 'androidx.cardview:cardview:1.0.0'

RecyclerView点击事件

系统没有提供ClickListener和LongClickListener。需要我们也可以自己去添加,这里介绍的是通过adapter中自己去提供回调。
Android API中有部分事件监听器的方法中都会有参数position和id,它们是用来描述一个视图当中的某一项(item)的属性。position描述该项在视图中所处的位置;而id描述的是该项的id,确切点说是该项在视图中所在的行位置。

思路梳理:
1、adapter中定义接口
2、adapter中定义接口的方法
3、adapter中在onBindViewHolder方法中,为MyViewHolder的itemView去设置相应的监听
4、Activity中去设置监听(回调我们设置的监听)

1、adapter中定义接口

    public interface OnItemClickListener{
        void onItemClick(int position);
    }

2、adapter中定义接口的方法

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

3、adapter中在onBindViewHolder方法中,为MyViewHolder的itemView去设置相应的监听

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private ImageView mIcon;
        private TextView mtitle;
        private int mPosition;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            //findViewById找到条目控件
            mIcon = itemView.findViewById(R.id.list_view_icon);
            mtitle = itemView.findViewById(R.id.list_view_title);
            //3.在onBindViewHolder中去为holder.itemView去设置相应的监听(其实是外部实现)
            if (mOnItemClickLister != null) {
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mOnItemClickLister.onItemClick(mPosition);
                    }
                });
            }
        }

        public void setData(ItemBean itemBean, int position) {
            this.mPosition = position;
            //设置数据
            mIcon.setImageResource(itemBean.icon);
            mtitle.setText(itemBean.title);
        }
    }
}

4、Activity中去设置监听

   //封装的监听函数initLister
    private void initLister() {
        mlistViewAdapter.setOnItemClickListener(new ListViewAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                //处理点击事件
                Toast.makeText(MainActivity.this,"点击了第"+position+"个条目",Toast.LENGTH_SHORT).show();
            }
        });
    }

1、想要控制其item们的排列方式,请使用布局管理器LayoutManager
2、如果要创建一个适配器,请使用RecyclerView.Adapter
3、想要控制Item间的间隔,请使用RecyclerView.ItemDecoration
4、想要控制Item增删的动画,请使用RecyclerView.ItemAnimator
5、CardView 扩展 FrameLayout 类并让您能够显示卡片内的信息,这些信息在整个平台中拥有一致的呈现方式。CardView 小部件可拥有阴影和圆角。
其中1、2是必须的。剩下的3、4、5三项,可以让RecyclerView更好看、效果更好。
参考:
RecyclerView使用解析
RecyclerView 教程,全面了解各种使用方法
Android RecyclerView 使用完全解析 体验艺术般的控件
【Android-Activity】CardView依赖添加及常用属性的说明
Android 分析监听器上的参数position和id(一)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值