Koltin33.Takeout订单界面观察者实现自动刷新(18)

本文介绍了一个基于Android的应用中如何利用观察者模式实现数据变化时UI的实时更新。具体包括MyReceiver作为被观察者接收消息并通知OrderRvAdapter观察者进行UI刷新的过程。

MyReceiver.kt使用观察者模式(OrderRvAdapter是观察者,MyReceiver是被观察者,数据发生变化以后,发送消息通知观察者刷新UI

package com.example.takeout.utils

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import cn.jpush.android.api.JPushInterface

class MyReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.e("order", "======================")
        val bundle: Bundle? = intent?.extras
        if(bundle!=null){
            val message:String? = bundle.getString(JPushInterface.EXTRA_MESSAGE)
//            Log.e("order", message)  //消息内容
            val extras:String? = bundle.getString(JPushInterface.EXTRA_EXTRA)
            if(!TextUtils.isEmpty(extras)){
                Log.e("order", extras)  //附加字段
                //方法一:通过mainactivity ---> orderFragment ---> OrderRvAdapter ---> 第二个条目的tvOrderType ---> 改变值40
                //方法二:使用观察者模式(OrderRvAdapter是观察者,MyReceiver是被观察者)
                OrderObservable.instance.newMsgComing(extras!!)

            }
        }
    }
}

OrderRvAdapter.kt观察者,继承Observer,实现update方法,在adapter初始化的时候观察者和被观察者建立绑定关系

package com.example.takeout.ui.adapter

import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.takeout.R
import com.example.takeout.model.beans.Order
import com.example.takeout.utils.OrderObservable
import org.jetbrains.anko.find
import org.json.JSONObject
import java.util.*
import kotlin.collections.ArrayList

class OrderRvAdapter (val context: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>(),
    Observer {

    init {
        OrderObservable.instance.addObserver(this)  //让观察者和被观察者建立绑定关系
    }

    override fun update(o: Observable?, data: Any?) {
        //观察者的响应
        Log.e("order","观察者收到了消息,消息内容:" + data)
        //更新UI
        val jsonObj : JSONObject = JSONObject(data as String)
        val pushOrderId = jsonObj.getString("orderId")
        val pushType = jsonObj.getString("type")
        var index = -1
        for(i in 0 until orderList.size){
            val order = orderList.get(i)
            if(order.id.equals(pushOrderId)){
                order.type = pushType
                index = i
            }
        }
        if(index !=-1) {
            notifyItemChanged(index) //刷新单个条目,减少UI开销
        }
//        notifyDataSetChanged()
    }

    private var orderList: List<Order> = ArrayList<Order>()

    fun setOrderData(orders: List<Order>) {
        this.orderList = orders
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
//        val itemView = View.inflate(context, R.layout.item_order_item, null)
        //TODO:没有填充满,原因是recycleview的孩子,测量模式是UNSPECIFY
        //通过返回值已经addview,如果attachToRoot使用true会再一次addView(),就会报错
        val itemView = LayoutInflater.from(context).inflate(R.layout.item_order_item,parent, false)
        return OrderItemHolder(itemView)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        (holder as OrderItemHolder).bindData(orderList.get(position))
    }

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

    inner class OrderItemHolder(item: View) : RecyclerView.ViewHolder(item) {
        val tvSellerName: TextView
        val tvOrderType: TextView
        init {
            //findviewbyId tv_order_item_seller_name tv_order_item_type
            tvSellerName = item.find(R.id.tv_order_item_seller_name)
            tvOrderType = item.find(R.id.tv_order_item_type) //订单状态
//            item.setOnClickListener {
//                val intent: Intent =  Intent(context, OrderDetailActivity::class.java)
//                intent.putExtra("orderId", order.id)
//                intent.putExtra("type", order.type)
//                context.startActivity(intent)
//            }
        }

        fun bindData(order: Order) {
            tvSellerName.text = order.seller?.name ?: "aaaa"
            tvOrderType.text = order.type?.let { getOrderTypeInfo(it) }
        }
    }

    private fun getOrderTypeInfo(type: String): String {
        /**
         * 订单状态
         * 1 未支付 2 已提交订单 3 商家接单  4 配送中,等待送达 5已送达 6 取消的订单
         */
        //            public static final String ORDERTYPE_UNPAYMENT = "10";
        //            public static final String ORDERTYPE_SUBMIT = "20";
        //            public static final String ORDERTYPE_RECEIVEORDER = "30";
        //            public static final String ORDERTYPE_DISTRIBUTION = "40";
        //            public static final String ORDERTYPE_SERVED = "50";
        //            public static final String ORDERTYPE_CANCELLEDORDER = "60";

        var typeInfo = ""
        when (type) {
            OrderObservable.ORDERTYPE_UNPAYMENT -> typeInfo = "未支付"
            OrderObservable.ORDERTYPE_SUBMIT -> typeInfo = "已提交订单"
            OrderObservable.ORDERTYPE_RECEIVEORDER -> typeInfo = "商家接单"
            OrderObservable.ORDERTYPE_DISTRIBUTION -> typeInfo = "配送中"
            OrderObservable.ORDERTYPE_SERVED -> typeInfo = "已送达"
            OrderObservable.ORDERTYPE_CANCELLEDORDER -> typeInfo = "取消的订单"
        }
        return typeInfo
    }
}

OrderObservable.kt订单状态被观察者

package com.example.takeout.utils

import java.util.*

/**
 * 订单状态被观察者
 */
class OrderObservable private constructor() : Observable() {
    companion object {
        val instance = OrderObservable()

        /* 订单状态
       * 1 未支付 2 已提交订单 3 商家接单  4 配送中,等待送达 5已送达 6 取消的订单*/
        val ORDERTYPE_UNPAYMENT = "10"
        val ORDERTYPE_SUBMIT = "20"
        val ORDERTYPE_RECEIVEORDER = "30"
        val ORDERTYPE_DISTRIBUTION = "40"
        // 骑手状态:接单、取餐、送餐
        val ORDERTYPE_DISTRIBUTION_RIDER_RECEIVE = "43"
        val ORDERTYPE_DISTRIBUTION_RIDER_TAKE_MEAL = "46"
        val ORDERTYPE_DISTRIBUTION_RIDER_GIVE_MEAL = "48"

        val ORDERTYPE_SERVED = "50"
        val ORDERTYPE_CANCELLEDORDER = "60"
    }

    fun newMsgComing(extras: String) {
        //从广播接受者获取到最新消息
        //通知所有观察者,新消息来了
        setChanged()
        notifyObservers(extras)
    }
}

 

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值