精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android列表優化終極奧義:DiffUtil讓RecyclerView比德芙還絲滑

移動開發 Android
在電商購物車、即時通訊聊天框、新聞資訊流等高頻操作場景中,很多開發者都遇到過這樣的尷尬:明明只修改了一個商品數量,整個列表卻突然閃動刷新;用戶快速滾動時突然卡頓,體驗直接打骨折。今天我們拆解如何用DiffUtil優化解決這些痛點。

在電商購物車、即時通訊聊天框、新聞資訊流等高頻操作場景中,很多開發者都遇到過這樣的尷尬:明明只修改了一個商品數量,整個列表卻突然閃動刷新;用戶快速滾動時突然卡頓,體驗直接打骨折。今天我們拆解如何用DiffUtil優化解決這些痛點。

為什么notifyDataSetChanged是性能殺手?

假設你的購物車有100件商品,用戶修改了第5件商品的數量:

1. 傳統方案:調用notifyDataSetChanged后,系統會重新創建100個Item視圖

2. 內存消耗:假如每個Item平均占用50KB,瞬間增加5MB內存壓力

3. 界面表現:用戶看到整個列表突然閃爍,滾動位置丟失

4. CPU消耗:遍歷所有Item進行數據綁定,浪費計算資源

// 典型示例(千萬別學!)
fun updateCart(items: List<CartItem>) {
    cartList = items
    // 全量刷新炸彈
    adapter.notifyDataSetChanged() 
}

DiffUtil場景解析

局部更新:電商商品多維度刷新

典型場景:同時處理價格變動、庫存變化、促銷標簽更新

class ProductDiffUtil : DiffUtil.ItemCallback<Product>() {
    overridefun areItemsTheSame(old: Product, new: Product) = old.skuId == new.skuId

    overridefun areContentsTheSame(old: Product, new: Product) = 
        old == new.copy( 
            // 排除實時變化字段
            lastUpdate = old.lastUpdate,
            animationState = old.animationState
        )

    // 返回多個變化的字段組合
    overridefun getChangePayload(old: Product, new: Product): Any? {
        val changes = mutableListOf<String>()
        if (old.price != new.price) changes.add("PRICE")
        if (old.stock != new.stock) changes.add("STOCK")
        if (old.promotionTags != new.promotionTags) changes.add("PROMO")
        returnif (changes.isNotEmpty()) changes elsenull
    }
}

// ViewHolder處理復合更新
overridefun onBindViewHolder(holder: ProductVH, position: Int, payloads: List<Any>) {
    when {
        payloads.isNotEmpty() -> {
            payloads.flatMap { it as List<String> }.forEach { change ->
                when (change) {
                    "PRICE" -> {
                        holder.priceView.text = newItem.getPriceText()
                        holder.startPriceChangeAnimation()
                    }
                    "STOCK" -> holder.stockBadge.updateStock(newItem.stock)
                    "PROMO" -> holder.promotionView.updateTags(newItem.promotionTags)
                }
            }
        }
        else -> super.onBindViewHolder(holder, position, payloads)
    }
}

動態列表:聊天消息的智能處理

高階技巧:支持消息撤回、消息編輯、消息狀態更新(已讀/送達)

class ChatDiffCallback : DiffUtil.ItemCallback<Message>() {
    overridefun areItemsTheSame(old: Message, new: Message): Boolean {
        // 處理消息ID變更場景(如消息重發)
        returnif (old.isRetry && new.isRetry) old.retryId == new.retryId 
               else old.msgId == new.msgId
    }

    overridefun areContentsTheSame(old: Message, new: Message): Boolean {
        // 消息狀態變更不觸發內容變化(避免氣泡重新渲染)
        return old.content == new.content && 
               old.attachments == new.attachments &&
               old.sender == new.sender
    }

    overridefun getChangePayload(old: Message, new: Message): Any? {
        returnwhen {
            old.status != new.status -> MessageStatusChange(new.status)
            old.reactions != new.reactions -> ReactionUpdate(new.reactions)
            else -> null
        }
    }
}

// 在Adapter中處理復雜更新
overridefun onBindViewHolder(holder: MessageViewHolder, position: Int, payloads: List<Any>) {
    when {
        payloads.any { it is MessageStatusChange } -> {
            holder.updateStatusIndicator(payloads.filterIsInstance<MessageStatusChange>().last().status)
        }
        payloads.any { it is ReactionUpdate } -> {
            holder.showReactionAnimation(payloads.filterIsInstance<ReactionUpdate>().last().reactions)
        }
        else -> super.onBindViewHolder(holder, position, payloads)
    }
}

分頁加載時的無縫銜接(新聞資訊流)

混合方案:結合Paging3實現智能預加載

class NewsPagingAdapter : PagingDataAdapter<NewsItem, NewsViewHolder>(NewsDiffUtil) {

    // 優化首次加載體驗
    overridefun onViewAttachedToWindow(holder: NewsViewHolder) {
        super.onViewAttachedToWindow(holder)
        if (holder.layoutPosition == itemCount - 3) {
            viewModel.loadNextPage()
        }
    }

    companionobject NewsDiffUtil : DiffUtil.ItemCallback<NewsItem>() {
        overridefun areItemsTheSame(old: NewsItem, new: NewsItem): Boolean {
            // 處理服務端ID沖突的特殊情況
            return"${old.source}_${old.id}" == "${new.source}_${new.id}"
        }

        overridefun areContentsTheSame(old: NewsItem, new: NewsItem): Boolean {
            // 排除閱讀狀態變化的影響
            return old.title == new.title &&
                   old.content == new.content &&
                   old.images == new.images
        }
    }
}

// 在ViewModel中智能合并數據
fun onNewPageLoaded(news: List<NewsItem>) {
    val current = adapter.snapshot().items
    val merged = (current + news).distinctBy { "${it.source}_${it.id}" }
    adapter.submitData(lifecycle, PagingData.from(merged))
}

復雜結構:樹形目錄的展開/收起

數據結構:支持無限層級的樹形結構

data classTreeNode(
    val id: String,
    val title: String,
    val children: List<TreeNode> = emptyList(),
    var isExpanded: Boolean = false
)

classTreeDiffCallback : DiffUtil.ItemCallback<TreeNode>() {
    overridefun areItemsTheSame(old: TreeNode, new: TreeNode): Boolean {
        // 考慮父節點變化的情況
        return old.id == new.id && old.parentId == new.parentId
    }

    overridefun areContentsTheSame(old: TreeNode, new: TreeNode): Boolean {
        // 排除展開狀態的影響
        return old.title == new.title && 
               old.children.size == new.children.size &&
               old.iconRes == new.iconRes
    }

    overridefun getChangePayload(old: TreeNode, new: TreeNode): Any? {
        returnwhen {
            old.isExpanded != new.isExpanded -> ExpansionChange(new.isExpanded)
            old.children != new.children -> StructureChange
            else -> null
        }
    }
}

// 處理樹形結構更新
fun toggleNode(position: Int) {
    val newList = currentList.toMutableList()
    val node = newList[position]
    newList[position] = node.copy(isExpanded = !node.isExpanded)
    
    if (node.isExpanded) {
        // 收起時移除子節點
        newList.removeAll { it.parentId == node.id }
    } else {
        // 展開時插入子節點
        val children = fetchChildren(node.id)
        newList.addAll(position + 1, children)
    }
    
    submitList(newList) {
        // 自動滾動到展開位置
        recyclerView.smoothScrollToPosition(position)
    }
}

性能優化黑科技

異步計算 + 智能降級

適用場景:

? 高頻更新場景(如股票行情列表)

? 低端機型性能保障

? 快速滾動時的穩定性需求

class SafeDiffUpdater(
    privateval adapter: ListAdapter<*, *>,
    privateval scope: CoroutineScope
) {
    // 最后提交版本控制
    privatevar lastSubmitVersion = 0

    fun safeSubmitList(newList: List<Item>, isForce: Boolean = false) {
        val currentVersion = ++lastSubmitVersion
        scope.launch(Dispatchers.Default) {
            // 計算階段耗時統計
            val calcStart = System.currentTimeMillis()
            val diffResult = try {
                DiffUtil.calculateDiff(createDiffCallback(adapter.currentList, newList))
            } catch (e: Exception) {
                // 降級策略:當計算超時(>50ms)時切換為全量更新
                if (System.currentTimeMillis() - calcStart > 50) nullelsethrow e
            }

            withContext(Dispatchers.Main) {
                if (currentVersion == lastSubmitVersion) {
                    when {
                        diffResult != null -> {
                            adapter.submitList(newList) { diffResult.dispatchUpdatesTo(adapter) }
                        }
                        isForce -> adapter.submitList(emptyList()).also { 
                            adapter.submitList(newList) 
                        }
                        else -> adapter.submitList(newList)
                    }
                }
            }
        }
    }

    // 創建支持中斷的DiffCallback
    privatefun createDiffCallback(old: List<Item>, new: List<Item>): DiffUtil.Callback {
        returnobject : DiffUtil.Callback() {
            // 實現基礎比對方法...
            overridefun areContentsTheSame(oldPos: Int, newPos: Int): Boolean {
                // 每1000次比對檢查一次是否超時
                if (oldPos % 1000 == 0 && System.currentTimeMillis() - calcStart > 50) {
                    throw CancellationException("Diff計算超時")
                }
                return old[oldPos] == new[newPos]
            }
        }
    }
}

? 版本號校驗防止網絡延遲導致的數據錯亂

? 每1000次比對檢查超時(System.currentTimeMillis() - calcStart > 50)

? 異常捕獲機制保證主線程安全

增量更新引擎

適用場景:

? 大型電商商品列表

? 社交媒體的歷史消息加載

? 日志查看器等超長列表場景

class IncrementalUpdateEngine {
    // 內存優化型差異計算
    fun calculateDelta(
        old: List<Item>,
        new: List<Item>,
        batchSize: Int = 500
    ): List<ChangeSet> {
        return sequence {
            var oldIndex = 0
            var newIndex = 0
            while (oldIndex < old.size || newIndex < new.size) {
                // 批量處理避免OOM 分片處理(500項/批)
                val oldBatch = old.subList(oldIndex, min(oldIndex + batchSize, old.size))
                val newBatch = new.subList(newIndex, min(newIndex + batchSize, new.size))

                // 使用位運算快速比對
                val changes = mutableListOf<ChangeSet>()
                for (i in oldBatch.indices) {
                    val oldItem = oldBatch[i]
                    val newItem = newBatch.getOrNull(i) ?: break
                    if (oldItem.id != newItem.id) {
                        changes.add(ChangeSet.Delete(oldIndex + i))
                        changes.add(ChangeSet.Insert(newIndex + i, newItem))
                    } elseif (oldItem != newItem) {
                        changes.add(ChangeSet.Update(newIndex + i, newItem))
                    }
                }
                yieldAll(changes)

                oldIndex += batchSize
                newIndex += batchSize
            }
        }.toList()
    }

    // 使用示例
    fun applyDelta(changes: List<ChangeSet>) {
        val newList = currentList.toMutableList()
        changes.forEach { change ->
            when (change) {
                is ChangeSet.Insert -> newList.add(change.index, change.item)
                is ChangeSet.Delete -> newList.removeAt(change.index)
                is ChangeSet.Update -> newList[change.index] = change.item
            }
        }
        adapter.submitList(newList)
    }
}

智能預加載 + 緩存預熱

適用場景:

? 長圖文混合信息流(如新聞APP)

? 地圖標記點列表

? 支持快速回溯的聊天記錄

class SmartPreloader(
    privateval recyclerView: RecyclerView,
    privateval prefetchDistance: Int = 3
) : RecyclerView.OnScrollListener() {

    // 分級緩存策略
    privateenumclassCacheLevel { HOT, WARM, COLD }
    privateval cache = mutableMapOf<CacheLevel, List<Item>>()

    overridefun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        val layoutManager = recyclerView.layoutManager as LinearLayoutManager
        val firstVisible = layoutManager.findFirstVisibleItemPosition()
        val lastVisible = layoutManager.findLastVisibleItemPosition()

        // 預加載觸發邏輯
        if (lastVisible + prefetchDistance >= adapter.itemCount - 1) {
            loadNextPage() // 常規分頁加載
        }

        // 緩存預熱策略
        val preheatRange = (firstVisible - prefetchDistance).coerceAtLeast(0).. 
                          (lastVisible + prefetchDistance).coerceAtMost(adapter.itemCount - 1)
        preheatCache(preheatRange)
    }

    privatefun preheatCache(range: IntRange) {
        // 三級緩存策略
        cache[CacheLevel.HOT] = currentList.subList(range.first, range.last + 1)
        cache[CacheLevel.WARM] = currentList.subList(
            (range.first - 50).coerceAtLeast(0), 
            (range.last + 50).coerceAtMost(currentList.size)
        )
        cache[CacheLevel.COLD] = currentList
    }

    // 內存優化型數據更新
    fun updateWithCache(newItems: List<Item>) {
        val merged = cache[CacheLevel.HOT]?.let { hot ->
            newItems.map { newItem ->
                hot.find { it.id == newItem.id } ?: newItem
            }
        } ?: newItems
        
        adapter.submitList(merged)
    }
}

對象和內存復用

適用設備:

? 內存 < 2GB 的低端機型

? Wear OS等嵌入式設備

? VR頭顯等高性能要求的設備

object RecyclerViewPoolManager {
    // 全局共享對象池
    privateval viewPool = RecyclerView.RecycledViewPool().apply {
        setMaxRecycledViews(VIEW_TYPE_ITEM, 20)
    }

    // 內存復用控制器
    classItemHolderManager {
        privateval itemCache = object : LruCache<Int, ItemHolder>(10) {
            overridefun create(key: Int): ItemHolder = ItemHolder()
        }

        fun bind(position: Int, item: Item) {
            val holder = itemCache.get(position % 10)
            holder.bind(item)
        }
    }

    // 數據壓縮策略
    fun compressListData(items: List<Item>): ByteArray {
        val output = ByteArrayOutputStream()
        ObjectOutputStream(output).use {
            it.writeInt(items.size)
            items.forEach { item ->
                it.writeLong(item.id)      // 8 bytes
                it.writeUTF(item.title)    // 2 + length
                it.writeFloat(item.price)  // 4 bytes
            }
        }
        return output.toByteArray()
    }
}

// 使用示例
recyclerView.setRecycledViewPool(RecyclerViewPoolManager.viewPool)
val compressedData = RecyclerViewPoolManager.compressListData(hugeList)
val parsedList = RecyclerViewPoolManager.parseCompressedData(compressedData)

組合使用建議

? 電商APP商品列表:異步計算 + 增量引擎

? 即時通訊聊天:智能預加載 + 內存優化

? 地圖標記點列表:增量引擎 + 緩存預熱

? 智能手表應用:內存優化 + 異步計算

避坑指南(血淚教訓)

? ?? ID碰撞陷阱:確保item.id唯一且穩定

? ??? 數據不可變性:使用data class時用val修飾

? ?? 列表引用問題:提交新數據必須創建新集合

? ?? 內存泄漏防護:銷毀時取消異步計算

責任編輯:武曉燕 來源: 沐雨花飛碟
相關推薦

2023-10-06 20:46:27

開發工具開發代碼

2021-11-17 08:16:03

內存控制Go

2025-03-03 12:00:00

JavaScriptfor 循環語言

2017-08-18 15:54:16

RecyclerVieDiffUtil數據

2018-06-11 14:14:22

2021-07-14 13:46:28

KubeVela阿里云容器

2020-07-22 15:15:28

Vue前端代碼

2025-03-10 08:44:17

2025-05-12 08:21:15

2024-05-30 11:44:37

2023-09-27 07:49:23

2025-06-04 08:35:00

立即執行函數IIFEJavaScript

2020-05-29 11:27:27

VS Code遠程工具

2023-03-15 15:54:36

Java代碼

2022-08-28 10:08:53

前端代碼前端

2022-09-05 13:16:42

MicroVim編輯器

2021-01-18 18:42:33

工具調優開發

2022-03-18 13:59:46

緩存RedisCaffeine

2025-10-17 08:07:36

2023-06-26 08:01:42

debugger技巧代碼
點贊
收藏

51CTO技術棧公眾號

成人黄色免费网| www.av天天| 爱搞国产精品| 欧美国产日韩在线观看| 成人免费黄色网| 豆国产97在线 | 亚洲| 欧美激情影院| 欧美日本免费一区二区三区| 18禁裸男晨勃露j毛免费观看| 香蕉视频黄色片| 老鸭窝一区二区久久精品| 欧美激情精品久久久久久蜜臀| 美国黄色a级片| 精品视频在线观看网站| 欧美性猛交xxxx乱大交蜜桃| 黄色录像特级片| 国产区视频在线播放| 国产成人在线视频网址| 国产精品久久久久久久久久久久| 欧美三级在线免费观看| 国产成人精品一区二区免费看京| 欧美xxxx在线观看| 爱爱爱爱免费视频| 成人激情综合| 偷拍日韩校园综合在线| 99精品一级欧美片免费播放| 欧美91精品久久久久国产性生爱| 国产不卡视频在线播放| 国产免费观看久久黄| 日韩欧美不卡视频| 国自产拍偷拍福利精品免费一| 中文字幕av一区二区三区谷原希美 | 久久婷婷中文字幕| 亚洲www啪成人一区二区| 亚洲国产精品视频| 9色视频在线观看| 欧洲日本在线| 国产精品沙发午睡系列990531| 国内精品一区二区| 免费看国产片在线观看| 国产在线精品视频| 国产欧美日韩免费| 成人黄色三级视频| 天堂成人免费av电影一区| 国内精品在线一区| 国产精品二区一区二区aⅴ| 亚洲欧美一区在线| 久久久精品一区二区三区| 国产馆在线观看| 激情婷婷综合| 在线视频日本亚洲性| 欧美激情aaa| 九九久久成人| 亚洲美女av电影| 日本少妇色视频| 美女毛片一区二区三区四区| 日韩av在线网站| aaaaaav| 日韩美脚连裤袜丝袜在线| 亚洲国内精品在线| 国产精品久久无码| 欧美精品国产白浆久久久久| 日韩av中文在线| 日本激情小视频| 精品国产视频| 久久九九免费视频| 人妻久久一区二区| 伊人久久综合| 日本亚洲欧洲色α| 一区二区www| 国产精品99久久久久久久女警 | 露出调教综合另类| 日韩激情视频在线| 欧美 日韩 国产 成人 在线观看 | 国产电影一区二区| 欧美大胆人体bbbb| 一女三黑人理论片在线| 精品一二三区| 另类图片亚洲另类| 日本三级免费看| 久久久久久久高潮| 91日本在线观看| 欧性猛交ⅹxxx乱大交| 久久先锋影音av| 一区二区三区四区视频在线观看| free性欧美hd另类精品| 亚洲444eee在线观看| 丰满人妻中伦妇伦精品app| 日韩av首页| 日韩三级视频在线看| 91精品国产自产| 日韩欧美二区| 97视频免费在线看| 在线观看国产精品入口男同| 国产精品亚洲视频| 欧美凹凸一区二区三区视频| 免费在线看黄网站| 懂色aⅴ精品一区二区三区蜜月| 亚洲色图38p| 日韩一级淫片| 一区二区三区视频免费在线观看| 福利所第一导航| 久久久久一区| 国产高清精品一区二区| 国产午夜视频在线观看| 亚洲精品一二三| 中文字幕视频在线免费观看| 国产一区二区三区亚洲综合| 国产亚洲一区二区精品| 久久国产精品二区| 久久99国产精品久久99果冻传媒| 国产一区二区三区奇米久涩 | 欧美极品在线观看| 色综合男人天堂| 一级黄色大片网站| 久久一日本道色综合| 黄色一级片国产| 欧洲美女精品免费观看视频| 亚洲精品日韩丝袜精品| 精品无码m3u8在线观看| 国产综合久久久久久鬼色| 日韩国产在线一区| 美女网站在线看| 欧美电影免费提供在线观看| 人与嘼交av免费| 性欧美长视频| 国语精品免费视频| 最新国产在线拍揄自揄视频| 欧美精品久久一区| 精品无码在线观看| 美女国产一区| 欧美日韩国产精品一区二区| 成人bbav| 亚洲精品福利在线| 久久亚洲国产成人精品性色| 国产一区二区三区久久久| 亚洲国产一区二区在线| 69堂精品视频在线播放| 亚洲色图日韩av| 五月婷婷色丁香| 久久亚区不卡日本| ww国产内射精品后入国产| 国产色噜噜噜91在线精品| 欧美老肥婆性猛交视频| 国产女人18毛片水18精| 亚洲三级电影全部在线观看高清| 天天影视色综合| 欧美gayvideo| 91免费在线视频网站| 欧美激情午夜| 欧美一区二区三区爱爱| 欧美又粗又大又长| 国产91在线|亚洲| 久久精品xxx| 成人搞黄视频| 欧美又大又粗又长| 高清国产福利在线观看| 精品视频一区二区三区免费| 正在播放国产对白害羞| 久久狠狠亚洲综合| 久久久99精品视频| 国产精品视屏| 人体精品一二三区| 北岛玲日韩精品一区二区三区| 欧美色视频一区| 91狠狠综合久久久| 国产传媒久久文化传媒| 黄色激情在线视频| 亚洲v天堂v手机在线| 国产成人高潮免费观看精品| 91高清在线| 日韩一区二区三区观看| 久草视频在线资源| 91在线云播放| 国产aaaaa毛片| 亚洲香蕉av| 好吊妞www.84com只有这里才有精品 | 亚洲精品国产手机| 精品久久久一区二区| 一区二区三区四区免费| 精品一区二区国语对白| 九九热只有这里有精品| 精品freesex老太交| 成人黄在线观看| 国产福利片在线观看| 国产一区二区免费| 亚洲国产精品国自产拍久久| 色一情一乱一乱一91av| 69夜色精品国产69乱| av亚洲精华国产精华精华| 国产精品入口免费软件| 欧美福利在线| 日本成人三级| 91在线一区| 国产精品九九久久久久久久| 欧美aaa免费| 国产午夜精品美女视频明星a级| 国产精品探花视频| 色综合av在线| 久久久国产精华液| 亚洲国产成人自拍| 黄色性视频网站| 蜜桃精品视频在线观看| 日韩日韩日韩日韩日韩| 日韩片欧美片| 久久久综合香蕉尹人综合网| 国产一区二区三区免费在线| 国产精品国产自产拍高清av水多 | 国产精品视频免费在线| av在线视屏| 久久久国产在线视频| 久久久久久久影视| 精品粉嫩aⅴ一区二区三区四区| 97超碰国产在线| 色婷婷综合久久久| 日韩av免费网址| 亚洲免费av高清| 日本在线观看网址| 国产色婷婷亚洲99精品小说| 这里只有精品在线观看视频| 国内精品自线一区二区三区视频| 北条麻妃在线一区| 99国产精品久久久久久久成人热| 国产日韩第一页| 欧美电影一区| 五月天亚洲综合情| 欧美日韩爱爱| 蜜桃成人在线| 人人精品亚洲| 精品一区在线播放| 国产伦理久久久久久妇女 | 亚洲精品国产片| 欧美一区二区三区白人| 亚洲天堂久久久久| 欧美在线小视频| 国产婷婷色一区二区在线观看| 亚洲aaa精品| 日韩精品一区二区不卡| 亚洲午夜在线视频| 久久久久久欧美精品se一二三四| 亚洲欧美区自拍先锋| 永久免费看片直接| 亚洲欧洲一区二区在线播放| 免费成人深夜蜜桃视频| 国产精品久久久99| 日韩av片在线免费观看| 亚洲欧洲无码一区二区三区| 国产又粗又长又黄的视频| 国产精品色呦呦| 亚洲av无一区二区三区| 中文字幕亚洲一区二区av在线| youjizz亚洲女人| 最近中文字幕一区二区三区| 五月天av网站| 亚洲精品国产a久久久久久| 久草成人在线视频| 香蕉久久一区二区不卡无毒影院| 日本一区二区三区四区五区 | 亚洲欧洲日产国码无码久久99| 一本色道久久综合| 无码精品国产一区二区三区免费| 久久一区二区三区超碰国产精品| 丁香婷婷激情网| 激情综合色综合久久| 亚洲三级在线视频| av成人老司机| 国产真人做爰视频免费| 国产精品国产三级国产| 丝袜 亚洲 另类 欧美 重口 | 黄色一级在线视频| 日韩一区精品视频| 热久久久久久久久| 成人av在线电影| 欧洲av一区二区三区| 亚洲人成网站色在线观看| 国产精彩视频在线| 欧美在线你懂得| 99精品在线看| 亚洲欧美另类自拍| 九色porny在线| 韩剧1988免费观看全集| 成人性片免费| 国产精品一区而去| 欧美日韩伦理在线免费| 中文字幕一区二区三区四区五区人 | 亚洲精品久久久久久动漫器材一区 | 秋霞成人影院| 97在线精品视频| 97精品国产综合久久久动漫日韩| 亚洲最大激情中文字幕| 国产一区二区三区四区| 777久久精品一区二区三区无码 | 亚洲h色精品| 国产免费一区二区三区视频| 国产美女视频91| 91精品人妻一区二区三区蜜桃欧美| 亚洲欧洲av另类| 你懂的国产在线| 日韩一级片网站| a天堂中文在线88| 国内精品久久久久久影视8| 曰本一区二区| 欧美日韩精品免费看| 欧美午夜不卡| 91国产精品视频在线观看| 成人午夜精品在线| 成年人免费观看视频网站| 亚洲午夜久久久久久久久久久| 中国一级特黄视频| 亚洲精品久久久久久下一站| fc2ppv国产精品久久| 国产精品爱久久久久久久| 人妖一区二区三区| 美女av免费观看| 狠狠久久亚洲欧美| 国产ts在线播放| 日韩欧美国产中文字幕| 亚洲国产综合网| 久热在线中文字幕色999舞| av在线日韩| 欧美精品亚洲精品| 亚洲大黄网站| 亚洲乱妇老熟女爽到高潮的片| 国产精品电影一区二区| 日本成人一级片| 亚洲精品一区中文| 日产福利视频在线观看| 国产精品一区免费观看| 欧美午夜影院| 手机看片国产精品| 亚洲人精品午夜| 91青青草视频| 国产性色av一区二区| 91av亚洲| 欧美一区二区三区电影在线观看| 99精品免费| 国产老熟女伦老熟妇露脸| 天天综合天天做天天综合| 欧美 日韩 国产 成人 在线 91| 欧美国产视频一区二区| 超碰97久久| 日本熟妇人妻xxxx| 成人a免费在线看| 五月婷婷激情网| 日韩精品在线免费| 涩涩视频在线免费看| 久久综合色一本| 日精品一区二区三区| 国产18无套直看片| 欧美日韩国产中文| 国产美女av在线| 99超碰麻豆| 国产一区二区三区自拍| 成人在线电影网站| 狠狠色狠色综合曰曰| 免费成人av电影| 国产精品视频在线观看| 国产精品二区不卡| 男人女人拔萝卜视频| 亚洲已满18点击进入久久| 深夜福利视频网站| 日韩美女激情视频| 国产精品久久天天影视| 日本一本在线视频| 五月婷婷激情综合网| 欧美套图亚洲一区| 国产日韩在线精品av| 中文字幕亚洲综合久久五月天色无吗''| 亚洲精品乱码久久久久久9色| 婷婷一区二区三区| 欧美久久综合性欧美| 亚洲91精品| av免费观看不卡| 色狠狠色噜噜噜综合网| 一级毛片视频在线观看| 操人视频欧美| 久久九九电影| 91高清免费看| 日韩av在线影院| 亚洲福利影视| 久久久亚洲精品无码| 日韩伦理在线一区| 538国产精品一区二区免费视频| 蜜臀av免费一区二区三区| 超碰成人在线播放| 午夜精品久久久久久久99水蜜桃| 国产高清视频免费最新在线| 91久久国产精品| 国产精品婷婷| 免费看一级大片| 国产丝袜精品第一页| 91精品国产一区二区在线观看| 国产aaa免费视频| 国产精品网站在线播放| 开心激情综合网| 国产精品一区二区久久国产| 激情综合网址| 久久一级免费视频| 亚洲精品色婷婷福利天堂| www一区二区三区|