Android RecyclerView点击宫格处于选择态外框变方框线,Kotlin

Android RecyclerView点击宫格处于选择态外框变方框线,Kotlin

XML 复制代码
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
XML 复制代码
implementation 'com.github.bumptech.glide:glide:4.16.0'

读出手机上所有图片,过滤gif图。加载图片形成4宫格,当点击小格子时候,小格子处于选择态,图片四周矩形红色框选,若再次点击,取消选择。

Kotlin 复制代码
import android.content.Context
import android.os.Bundle
import android.provider.MediaStore
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.google.android.material.imageview.ShapeableImageView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext


class MainActivity : AppCompatActivity() {
    companion object {
        const val IMAGE_SIZE = 300
        const val GRID_SIZE = 4

        const val VIEW_TYPE_NORMAL = 1
        const val VIEW_TYPE_SELECTED = 2
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val mRecyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        val layoutManager = GridLayoutManager(this, GRID_SIZE)
        mRecyclerView?.layoutManager = layoutManager

        val adapter = MyAdapter()
        mRecyclerView?.adapter = adapter

        lifecycleScope.launch(Dispatchers.IO) {
            val items = readAllImage(this@MainActivity)
            withContext(Dispatchers.Main) {
                adapter?.dataChanged(items)
            }
        }
    }

    class MyAdapter : RecyclerView.Adapter<ViewHolder>() {
        private var items = arrayListOf<MyData>()
        fun dataChanged(l: ArrayList<MyData>) {
            items = l

            this.notifyDataSetChanged()
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
            when (viewType) {
                VIEW_TYPE_SELECTED -> {
                    val view = LayoutInflater.from(parent.context)
                        .inflate(R.layout.selected_image, parent, false)
                    return MyVHSelected(view!!)
                }

                else -> {
                    var view =
                        LayoutInflater.from(parent.context).inflate(R.layout.image, parent, false)
                    return MyVHNormal(view!!)
                }
            }
        }

        override fun getItemCount(): Int {
            return items.size
        }

        override fun getItemViewType(position: Int): Int {
            var type = VIEW_TYPE_NORMAL
            if (items[position].selected) {
                type = VIEW_TYPE_SELECTED
            }

            return type
        }

        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
            holder.itemView.setOnClickListener {
                items[position].selected = !items[position].selected

                this.notifyItemChanged(position)
            }

            val uri = items[position].path

            var siv: ShapeableImageView? = null
            when (getItemViewType(position)) {
                VIEW_TYPE_NORMAL -> {
                    siv = (holder as MyVHNormal).image
                }

                VIEW_TYPE_SELECTED -> {
                    siv = (holder as MyVHSelected).image
                }
            }

            Glide.with(holder.itemView.context)
                .asBitmap()
                .load(uri)
                .centerCrop()
                .override(IMAGE_SIZE)
                .into(siv!!)
        }
    }

    class MyVHNormal(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val image: ShapeableImageView = itemView.findViewById(R.id.siv)
    }

    class MyVHSelected(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val image: ShapeableImageView = itemView.findViewById(R.id.siv)
    }

    private fun readAllImage(context: Context): ArrayList<MyData> {
        val photos = ArrayList<MyData>()

        //读取所有图片
        val cursor = context.contentResolver.query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null
        )

        var index = 0
        while (cursor!!.moveToNext()) {
            //路径 uri
            val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))
            if (path.endsWith(".gif")) {
                //过滤gif图片。
                continue
            }

            //图片名称
            //val name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))

            //图片大小
            //val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE))

            photos.add(MyData(path, index++))
        }
        cursor.close()

        return photos
    }

    class MyData(var path: String, var index: Int) {
        var selected = false
    }
}
XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

image.xml:

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.imageview.ShapeableImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/siv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="1px"
    android:clickable="true"
    android:scaleType="centerCrop"
    android:src="@drawable/ic_launcher_foreground" />

selected_image.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.imageview.ShapeableImageView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/siv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:scaleType="centerCrop"
    android:src="@drawable/ic_launcher_foreground"
    app:strokeColor="@android:color/holo_red_dark"
    app:strokeWidth="5dp" />

Android ConstraintLayout分组堆叠圆角ShapeableImageView-CSDN博客文章浏览阅读1k次。《Android大图片之变换缩略图,以及对原始大图片按照指定宽、高裁剪成缩略图》在Android的ImageView加载图像资源过程中,出于性能和内存开销的需要,有时候需要把一个原始的超大图片按照一定比例等比例缩放成较小的缩略图,或者需要把原始的超大图片,裁剪成指定宽高值的较小图片,针对这种开发需求,可以使用Android SDK自身提供的工具类:ThumbnailUtils完成。现在结合他人的代码加以修改,给出一个以原始图形中心为原点,修剪图片为头像的工具类,此类可以直接在布局文件中加载使用,比。https://blog.csdn.net/zhangphil/article/details/134071791Android描边外框stroke边线、rotate旋转、circle圆形图的简洁通用方案,基于Glide与ShapeableImageView,Kotlin-CSDN博客文章浏览阅读1.2k次。Android RoundedBitmapDrawable:Android官方的圆角图形图象实现方案RoundedBitmapDrawable是Android在support v4的扩展包中新增的实现圆角图形的关键类,借助RoundedBitmapDrawable的帮助,可以轻松的以Android标准方式实现圆角图形图象。现在结合他人的代码加以修改,给出一个以原始图形中心为原点,修剪图片为头像的工具类,此类可以直接在布局文件中加载使用,比。所实现的在Kotlin动态代码中绘制的描边效果。https://blog.csdn.net/zhangphil/article/details/134314380

Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类-CSDN博客文章浏览阅读4.2k次,点赞2次,收藏3次。Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类我写的附录文章2,介绍了Android如何基于OnItemTouchListener +GestureDetector实现单击、长按事件的监听,由于如今RecyclerView在Android开发是如此的普遍,以及Recyclehttps://blog.csdn.net/zhangphil/article/details/53231344

相关推荐
思忖小下2 小时前
深入Android架构(从线程到AIDL)_10 主线程(UI 线程)的角色
android·ui线程
工程师老罗3 小时前
我用AI学Android Jetpack Compose之开篇
android·android jetpack
热心市民运维小孙3 小时前
Mysql8主从复制(兼容低高版本)
android·adb
佛系小嘟嘟3 小时前
Android Jetpack Compose开发小组件【入门篇】
android·开发语言·android jetpack·小组件
工程师老罗3 小时前
我用AI学Android Jetpack Compose之入门篇(1)
android·android jetpack
思忖小下10 小时前
深入Android架构(从线程到AIDL)_08 认识Android的主线程
android·ui线程
G佳伟11 小时前
vue字符串的数字比较大小有问题
android·前端·vue.js
tanghongchang12312 小时前
Mac Android Studio 提升Mac的编译速度
android·macos·android studio
俊杰_12 小时前
rk3562 安卓14 -安卓15 锁屏图标显示异常
android
黑客-秋凌13 小时前
[CTF/网络安全] 攻防世界 simple_php 解题详析
android·web安全·php