zoukankan      html  css  js  c++  java
  • 【Android Studio】安卓开发初体验——RecycleView的使用

    RecycleView简介

    增强版的ListView

    能够实现横向滚动

    RecyclerView是support-v7包中的新组件

    是一个强大的滑动组件

    与经典的ListView相比,同样拥有item回收复用的功能

    RecyclerView封装了viewholder的回收复用

    也就是说RecyclerView标准化了ViewHolder

    编写Adapter面向的是ViewHolder

    提供了一种插拔式的体验,高度的解耦

    可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制

    样例效果

    实现图书列表,点击一个图书,可查看详细图书信息

    实现过程

    1. 添加库引用

    在build.gradle文件中添加依赖

    dependencies {
      implementation 'androidx.recyclerview:recyclerview:1.1.0'
    }

    2. 布局使用RecycleView控件

    拉入一个recyclerView

    或是直接编辑代码

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </LinearLayout>
    

      

    3. 自定义适配器Adapter

    创建一个book_item.xml作为每一本书籍的显示格式

    其内容为

     

    创建一个Book书籍类

    package com.example.myapplication3
    
    class Book(val name: String, val imageId: Int, val intro: String) {
    }
    

    创建一个BookAdapter适配器

    4. 实现内部类ViewHolder

    class BookAdapter(val bookList: List<Book>):
        RecyclerView.Adapter<BookAdapter.ViewHolder>(){
    
        inner class ViewHolder(view: View):
          RecyclerView.ViewHolder(view){
            val bookImage: ImageView = view.findViewById(R.id.book_image)
            val bookName: TextView = view.findViewById(R.id.book_name)
            val bookIntro: TextView = view.findViewById(R.id.book_intro)
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
      
        }
        override fun getItemCount(): Int {
      } }

      

    5. 实现3个方法

    在onBindViewHolder中实现页面的跳转

    使用intent的putExtra字符串数据

       override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.book_item, parent, false)
            val viewHolder = ViewHolder(view)
            return ViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val book = bookList[position]
            holder.bookImage.setImageResource(book.imageId)
            holder.bookName.text = book.name
            holder.bookIntro.text = book.intro
            holder.itemView.setOnClickListener{
    
                val position = holder.adapterPosition
                val book = bookList[position]
                val intent = Intent(holder.itemView.context, DetailActivity::class.java)
                intent.putExtra("book_imageId", book.imageId.toString())
                intent.putExtra("book_name", book.name)
                intent.putExtra("book_intro", book.intro)
                holder.itemView.context.startActivity(intent)
            }
            holder.bookImage.setOnClickListener{
                //同上holder.itemView.setOnListener内容
            }
        }
        override fun getItemCount(): Int = bookList.size
    

      

    6. 使用布局和适配器

    主页代码

    MainActivity.kt

    package com.example.myapplication3
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.recyclerview.widget.LinearLayoutManager
    import kotlinx.android.synthetic.main.activity_main.*
    
    class MainActivity : AppCompatActivity() {
        private val BookList = ArrayList<Book>()
        private val bookImageIds = intArrayOf(
            R.drawable.book1,
            R.drawable.book2, R.drawable.book3,
            R.drawable.book4, R.drawable.book5,
            R.drawable.book6, R.drawable.book7,
            R.drawable.book8, R.drawable.book9,
            R.drawable.book10
        )
        private val bookNames = arrayOf(
            "Java编程思想", "程序员修炼之道", "零基础入门学习Python", "Java从入门到精通"
            , "深入理解Java虚拟机", "算法导论", "Android开发艺术探索", "Android进阶之光"
            , "疯狂安卓讲义", "Android开发从入门到精通"
        )
        private val bookIntros = arrayOf(
            "Java编程思想", "程序员修炼之道", "零基础入门学习Python", "Java从入门到精通"
            , "深入理解Java虚拟机", "算法导论", "Android开发艺术探索", "Android进阶之光"
            , "疯狂安卓讲义", "Android开发从入门到精通"
        )
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            init()
            val layoutManager = LinearLayoutManager(this)
            recyclerView.layoutManager = layoutManager
            val adapter = BookAdapter(BookList)
            recyclerView.adapter = adapter
        }
    
        fun init(){
            for(i in 0 until bookNames.size){
                val book = Book(bookNames[i], bookImageIds[i], bookIntros[i])
                BookList.add(book)
            }
        }
    }

    详细页代码

    DetailActivity.kt

    使用intent的getStringExtra方法获取上一页数据

    注意数据名称要

    package com.example.myapplication3
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import kotlinx.android.synthetic.main.activity_detail.*
    
    class DetailActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_detail)
    
            val name = intent.getStringExtra("book_name")
            val intro = intent.getStringExtra("book_intro")
            val imageId = intent.getStringExtra("book_imageId").toInt()
            imageView.setImageResource(imageId)
            book_introView.text = intro
            book_nameView.text = name
        }
    }
    

    详情页布局随意

    activity_detail.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".DetailActivity">
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="horizontal">
    
            <LinearLayout
    
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:orientation="vertical">
    
                <TextView
                    android:id="@+id/book_nameView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="TextView"
                    android:textSize="18sp"
                    android:textStyle="bold" />
    
                <TextView
                    android:id="@+id/book_introView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="TextView" />
    
            </LinearLayout>
    
        </LinearLayout>
    </LinearLayout>
    

      

    参考资料:

    第一行代码 Android(第3版本)郭霖

    GDUFE移动应用开发课程

  • 相关阅读:
    MongoDB数据类型
    Redis数据类型
    RHEL7 CentOS7 检查查看精简指令
    Linux命令:查看登录用户
    JavaScript错误之:Uncaught ReferenceError: $ is not defined
    Linux下因为系统编码问题造成乱码的解决办法
    Linux系统下的程序开发之:命名规范
    优化php代码
    Git工具:Widows下的使用(提交到Github)
    MongoDB
  • 原文地址:https://www.cnblogs.com/leftstan/p/13942854.html
Copyright © 2011-2022 走看看