RecyclerView与Listview对比和RecyclerView实现代码实例

一、前言

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
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以,以下是将 RecyclerView 转换为 ListView 的步骤: 1. 修改布局文件 将原来的 RecyclerView 替换为 ListView 2. 修改适配器 将适配器 MemoAdapter 继承自 BaseAdapter,而不是 RecyclerView.Adapter<MemoAdapter.ViewHolder>,然后实现 BaseAdapter 的相关方法,例如 getCount()、getItem()、getView() 等。 3. 修改 ViewHolder 由于 ListView 不使用 ViewHolder,因此可以删除 ViewHolder 内部类。 4. 修改 Activity 或 Fragment 将 RecyclerView 实例化为 ListView,并将适配器设置为 MemoAdapter 的实例。 以下是修改后的代码示例: ```java public class MemoAdapter extends BaseAdapter { private Context mContext; private List<MemoBean> mArr1; private MyDbHelper mHelper1; private SQLiteDatabase mDb; public MemoAdapter(Context context, List<MemoBean> arr1) { this.mContext = context; this.mArr1 = arr1; } @Override public int getCount() { return mArr1.size(); } @Override public MemoBean getItem(int position) { return mArr1.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_memo, parent, false); } MemoBean memo = getItem(position); TextView titleTv = convertView.findViewById(R.id.tv_title); TextView contentTv = convertView.findViewById(R.id.tv_content); TextView timeTv = convertView.findViewById(R.id.tv_time); titleTv.setText(memo.getTitle()); contentTv.setText(memo.getContent()); timeTv.setText(memo.getTime()); return convertView; } } ``` 在 Activity 或 Fragment 中将 RecyclerView 替换为 ListView: ```java ListView listView = findViewById(R.id.list_view); MemoAdapter adapter = new MemoAdapter(this, memoList); listView.setAdapter(adapter); ``` 希望这个示例对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值