一、前言
RecyclerView是最近比较流行的列表布局,是listview的豪华升级版,作为一个Android开发人员还是需要多了解一下的,因为它可以更容易的实现一些Listview不容易实现的功能
二、RecyclerView与Listview对比
(1)RecyclerView:优点:有更好的四级缓存机制、可以单行删除和增加,并且有动画效果,可实现竖直滑动、左右滑动和瀑 布流功能;扩展性强。
缺点:实现起来较listview复杂,需要自己写点击功能(这个需要在adapter中写接口的方式实现), activity中需要编写多个属性来加载布局。
(2)ListView:优点和缺点和RecyclerView相反,大家在开发中可以根据自己的需求来使用RecyclerView和listview,如果列表没有什么动画效果和刷新次数较少,可以使用listview,相反则使用RecyclerView。
三、RecyclerView属性详解
(1)RecyclerView布局:需要使用LinearLayoutManager(线性布局效果)、GridLayoutManager(网格布局效果)、StaggeredGridLayoutManager(瀑布流布局效果)
val linearLayoutManager = LinearLayoutManager(this)
(2)LinearLayoutManager可以设置水平布局和竖直布局
linearLayoutManager.orientation= LinearLayout.HORIZONTAL
(3)只能在代码中实现分割线,在RecyclerView中不能添加分割线:
//添加分割线
id_recyclerview.addItemDecoration(DividerItemDecoration(
this, DividerItemDecoration.VERTICAL))
(4)设置添加和移除的动画效果
//设置Item增加、移除动画
id_recyclerview.setItemAnimator(DefaultItemAnimator())
(5)数据增加和移除功能实现
//移除单个列的方法,有动画效果
adapter.notifyItemRemoved(position)
//添加单行方式,有动画效果
//adapter.notifyItemInserted(position)
四、RecyclerView代码实现
(1)编写xml文件
<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.support.v7.widget.RecyclerView
android:id="@+id/id_recyclerview"
android:divider="#ffff0000"
android:dividerHeight="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
(2)编写activity文件 ,代码中注释已经很详细了
class RecyclerViewActivity : BaseActivity() {
var strList=ArrayList<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.recycler_view_layout)
initData()
initView()
}
fun initView(){
//创建LinearLayoutManager,用于决定RecyclerView的布局方式
val linearLayoutManager = LinearLayoutManager(this)
//用于显示列表的滑动方向
//linearLayoutManager.orientation= LinearLayout.HORIZONTAL
id_recyclerview!!.layoutManager=linearLayoutManager
var adapter =RecyclerViewAdapter(strList)
id_recyclerview!!.adapter=adapter
//设置Item增加、移除动画
id_recyclerview.setItemAnimator(DefaultItemAnimator())
//添加分割线
id_recyclerview.addItemDecoration(DividerItemDecoration(
this, DividerItemDecoration.VERTICAL))
adapter!!.setOnMeanCallBack(object : RecyclerViewAdapter.onMeanCallBack{
override fun isDisMess(position : Int) {
strList.removeAt(position)
//移除单个列的方法,有动画效果
adapter.notifyItemRemoved(position)
//添加单行的动画效果
//adapter.notifyItemInserted(position)
}
})
}
fun initData(){
for (i in 0..100){
strList.add("我是第___"+i.toString())
}
}
(3)书写adapter类
class RecyclerViewAdapter(var strList: ArrayList<String>) : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {
private var onRecyclerInterface: OnRecyclerInterface? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_adapter, parent, false)
return ViewHolder(view)
}
//在内部类中完成对控件的绑定
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
//在onBindViewHolder() 中完成对数据的填充
override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
//只大括号内所有内容前都加上with中的内容
with(holder?.itemView!!){
item_tv?.setText(strList.get(position))
recyler_click?.setOnClickListener {
val pos = holder.layoutPosition
onRecyclerInterface!!.isOnclick(pos)
}
}
}
//这个方法很简单了,返回playerList中的子项的个数
override fun getItemCount(): Int {
return strList.size
}
fun setOnMeanCallBack(m: OnRecyclerInterface) {
this.onRecyclerInterface = m
}
}