Android 实现双列图片瀑布流式布局

嚴華  金牌会员 | 2024-11-25 11:46:09 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 850|帖子 850|积分 2550

Android 实现双列图片瀑布流式布局

实现双列图片瀑布流布局,关键在于 RecyclerView 的 StaggeredGridLayoutManager 和图片的动态加载。以下是实现步调:

1. 添加须要依靠

使用 Glide 加载图片。确保在 build.gradle 中添加依靠:
  1. implementation 'com.github.bumptech.glide:glide:4.15.1'
  2. annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'
复制代码
2. 布局文件

主布局文件(activity_main.xml)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context=".MainActivity">
  8.     <androidx.recyclerview.widget.RecyclerView
  9.         android:id="@+id/recyclerView"
  10.         android:layout_width="match_parent"
  11.         android:layout_height="match_parent"
  12.         android:scrollbars="vertical" />
  13. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
子项布局文件(item_staggered_image.xml)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="wrap_content"
  6.     android:orientation="vertical"
  7.     android:padding="4dp">
  8.     <ImageView
  9.         android:id="@+id/image_view"
  10.         android:layout_width="match_parent"
  11.         android:layout_height="wrap_content"
  12.         android:scaleType="centerCrop" />
  13. </LinearLayout>
复制代码
3. RecyclerView 配置

  1. package com.check.waterfall
  2. import androidx.appcompat.app.AppCompatActivity
  3. import android.os.Bundle
  4. import androidx.recyclerview.widget.RecyclerView
  5. import androidx.recyclerview.widget.StaggeredGridLayoutManager
  6. class MainActivity : AppCompatActivity() {
  7.     override fun onCreate(savedInstanceState: Bundle?) {
  8.         super.onCreate(savedInstanceState)
  9.         setContentView(R.layout.activity_main)
  10.         val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
  11.         // 设置 StaggeredGridLayoutManager 为双列
  12.         recyclerView.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
  13.         // 模拟图片数据
  14.         val imageUrls = listOf(
  15.             "https://via.placeholder.com/300x200",
  16.             "https://via.placeholder.com/300x300",
  17.             "https://via.placeholder.com/300x400",
  18.             "https://via.placeholder.com/300x500",
  19.             "https://via.placeholder.com/300x600",
  20.             "https://via.placeholder.com/300x700",
  21.             "https://via.placeholder.com/300x800",
  22.             "https://via.placeholder.com/300x900",
  23.             "https://via.placeholder.com/300x1000",
  24.             "https://via.placeholder.com/300x1100",
  25.             "https://via.placeholder.com/300x1200",
  26.             "https://via.placeholder.com/300x1300",
  27.             "https://via.placeholder.com/300x1400",
  28.             "https://via.placeholder.com/400x300",
  29.             "https://via.placeholder.com/400x600",
  30.             "https://via.placeholder.com/400x900",
  31.             "https://via.placeholder.com/400x1200",
  32.         )
  33.         // 设置 Adapter
  34.         recyclerView.adapter = StaggeredImageAdapter(imageUrls)
  35.     }
  36. }
复制代码
4. 创建 RecyclerView Adapter

  1. package com.check.waterfall
  2. import android.view.LayoutInflater
  3. import android.view.View
  4. import android.view.ViewGroup
  5. import android.widget.ImageView
  6. import androidx.recyclerview.widget.RecyclerView
  7. import com.bumptech.glide.Glide
  8. class StaggeredImageAdapter(private val imageUrls: List<String>) :
  9.     RecyclerView.Adapter<StaggeredImageAdapter.ViewHolder>() {
  10.     private val itemHeights = mutableMapOf<Int, Int>() // 缓存每个位置的高度
  11.     class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
  12.         val imageView: ImageView = view.findViewById(R.id.image_view)
  13.     }
  14.     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
  15.         val view = LayoutInflater.from(parent.context)
  16.             .inflate(R.layout.item_staggered_image, parent, false)
  17.         return ViewHolder(view)
  18.     }
  19.     override fun onBindViewHolder(holder: ViewHolder, position: Int) {
  20.         // 动态设置高度,使用缓存高度
  21.         val params = holder.imageView.layoutParams
  22.         if (!itemHeights.containsKey(position)) {
  23.             itemHeights[position] = (400..800).random() // 仅随机生成一次高度
  24.         }
  25.         params.height = itemHeights[position] ?: 400
  26.         holder.imageView.layoutParams = params
  27.         // 使用 Glide 加载图片
  28.         Glide.with(holder.itemView.context)
  29.             .load(imageUrls[position])
  30.             .placeholder(android.R.drawable.progress_indeterminate_horizontal)
  31.             .error(android.R.drawable.stat_notify_error)
  32.             .into(holder.imageView)
  33.     }
  34.     override fun getItemCount(): Int = imageUrls.size
  35. }
复制代码
5. 添加网络权限

  1. <uses-permission android:name="android.permission.INTERNET" />
复制代码
6. 效果展示

运行上述代码后,RecyclerView 将展示双列的瀑布流布局,图片加载时的高度随机化。使用 Glide 还可以处理图片的缓存和加载失败的环境。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表