本文使用的是Kotlin编写
RecyclerView,提供一种插拔式的体验,高度的解耦,异常的灵活,它本身只管回收与复用View,其他的开发者通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现各种不同的效果。
一、项目使用
1.添加依赖
implementation 'com.android.support:recyclerview-v7:27.1.1'
2.布局使用
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerList" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ff00ff" />
3.创建适配器
class MyAdapter : RecyclerView.Adapter<MyAdapter.MyViewHolder>() { var mData: ArrayList<String>? = null var mContext: Context? = null fun getData(mData: ArrayList<String>, mContext: Context) { this.mData = mData this.mContext = mContext } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { holder.recycleritem_tv!!.text = mData!![position] } override fun getItemCount(): Int { return mData!!.size } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { /** * 这里的inflate的第二个参数如果使用parent,每页只显示一条数据 * 解决 * 1.RecyclerView 依赖包版本降低 * 2.第二个参数使用null,但是layout的根部局的所有layout类型属性都被忽略(layout_xxx) * 包括width、height、margin等,各种修改后会造成布局冗余 * 3.item布局的高度不要设置match_parent,因为RecycleView不能像ListView一样自适应(推荐使用)。 * */ return MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.recycler_item, parent, false)) } class MyViewHolder : RecyclerView.ViewHolder { var recycleritem_tv: TextView? = null constructor(itemView: View) : super(itemView) { recycleritem_tv = itemView.findViewById(R.id.recycleritem_tv) } } }
4.Activity实现
class RecyclerViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_recycler_view) /** * 设置RecycleView的布局管理器,需要什么样的布局设置什么样的 * */ /*类似ListView*/ recyclerList.layoutManager = LinearLayoutManager(this) /*类似GridView,第二个参数是列数(如果需要设置头部,头部会根据列数一样分,需要另外设置。下篇说)*/ // recyclerList.layoutManager = GridLayoutManager(this, 2) /*瀑布流布局,第一个参数是列数或者行数,第二个参数 * 如果传入的是StaggeredGridLayoutManager.VERTICAL代表有多少列 * 那么传入的如果是StaggeredGridLayoutManager.HORIZONTAL就代表有多少行*/ recyclerList.layoutManager = StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL) var mDatas = ArrayList<String>() var i = 0 for (i in 0 until 10) { mDatas.add("你好") } var adapter = MyAdapter() adapter.getData(mDatas, this) /**添加适配器*/ recyclerList.adapter = adapter } }
5.点击事件
1.RecyclerView.Adapter中实现
/** * 此处使用companion object修饰,其他地方可以直接类名.其中的变量、方法 * */ companion object { var itemListener: OnItemClickListener? = null fun setOnItemClickListener(itemClickListener: OnItemClickListener) { this.itemListener = itemClickListener } } interface OnItemClickListener { fun onItemClick(view: View, position: Int) }
2.ViewHolder中实现,在需要添加监听的控件上添加此监听
override fun onClick(p0: View?) { if (MyAdapter.itemListener != null) { MyAdapter.itemListener!!.onItemClick(p0!!, getItemId()!!.toInt()) } }
3.Activity中实现
MyAdapter.setOnItemClickListener(object : MyAdapter.OnItemClickListener { override fun onItemClick(view: View, position: Int) { /** * 此处填写自己需要处理的事件 **/ } })