设计模式之观察者模式在Listview中的应用

有时候我们会有这么一个需求,在Listview的某个Item上有个按钮,点击这个按钮之后呢,需要对其它的item做一些操作,就像下面这个:

采纳按钮点击之前:采纳按钮点击之后:

简单介绍一下这两张图的意思:

模拟了一个Listview,在每个Item上都有一个“采纳”按钮,当点击其中一个“采纳”之后,需要将其它“采纳”按钮隐藏,并且自身需要改为“已采纳”,如后面的图所示。

我们有一种简单的办法可以做到,就是更改数据的值,并且让Adapter重新刷新一遍,这是一种简单粗暴的方式,用户体验非常不好,会使整个页面都闪一下。

那么为了有没有什么更好的办法呢?有的,使用我们的观察者模式。

观察者模式在我们这里的基本实现方式是:当其中一个按钮被点击之后,通过回调更新其它控件即可。如何实现呢?以简单代码来说明:

package com.sahadev;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.sahadev.renren.R;public class MainActivity extends Activity {@ViewInject(R.id.listview)private ListView listview;private BaseAdapter internalAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_zoom);ViewUtils.inject(this);internalAdapter = new InternalAdapter(this);listview.setAdapter(internalAdapter);}/*** 观察者模式的回调接口* * @author Sahadev**/public interface Callback {public void update(Message msg);}private static class InternalAdapter extends BaseAdapter {private int dataSize = 6;private Map<View, Callback> maps;private LayoutInflater inflate;public InternalAdapter(Context context) {super();inflate = LayoutInflater.from(context);maps = new HashMap<View, MainActivity2.Callback>();}@Overridepublic int getCount() {return dataSize;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@SuppressLint("InflateParams")@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = inflate.inflate(R.layout.listview_item_layout, null);Button button = (Button) convertView.findViewById(R.id.button);// 生成一个观察者Callback callback = new Callback() {@Overridepublic void update(Message msg) {// 当其中一个按钮被点击时通过调用update方法来更新其它UI// 先隐藏所有的采纳按钮View view = (View) msg.obj;if (msg.what == 0) {view.setVisibility(View.INVISIBLE);} else {Button button = (Button) view;button.setText("已采纳");button.setEnabled(false);}}};// 将我们的需要更改的对象和观察者一并放入mapsmaps.put(button, callback);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(final View v) {// 遍历maps中所有的监听者Set<Entry<View, Callback>> entrySet = maps.entrySet();Iterator<Entry<View, Callback>> iterator = entrySet.iterator();while (iterator.hasNext()) {Entry<View, Callback> next = iterator.next();// 使用value的update方法将key作为参数使得监听的地方对它进行修改Message msg = new Message();View temp = next.getKey();msg.obj = temp;if (temp.equals(v) || temp == v) {// 如果是点击的按钮本身,则需要对它进行特殊处理msg.what = 1;}// 通知所有的观察者next.getValue().update(msg);}}});}return convertView;}}
}


最后附上我们的运行效果图,是不是很实用呢?





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新书速递 | 《知识图谱:方法、实践与应用》

本文转载自公众号&#xff1a;博文视点Broadview 。互联网促成了大数据的集聚&#xff0c;大数据进而促进了人工智能算法的进步。近年来知识图谱作为AI领域底层技术被越来越多的人谈起。知识图谱的升温得益于新数据和新算法为规模化知识图谱构建提供了新的技术基础和发展条件&a…

Github Star过万的阿里学长独家干货分享

浅梦是我认识的一位浙大计算机系的学长&#xff0c;目前在阿里从事算法相关的工作。无论在学校还是工作中&#xff0c;他都保持着对新知识的学习和分享。他的github star 1w&#xff0c;世界排名700&#xff0c;参与开发的项目下载量接近30w次。主要涉及「推荐系统」&#xff0…

pytorch 和 tensorflow2.0 方法替换

Embedding初始化 pytorch: Embedding() tf2.0: random.normal() # 验证均值和方差 def confirm(weight):mean np.sum(weight) / dimprint("均值: {}".format(mean))square_sum np.sum((mean - weight) ** 2)print("方差: {}".format(square_sum / dim)…

React Native在美团外卖客户端的实践

MRN简介 MRN&#xff08;Meituan React Native&#xff09; 是基于开源的React Native框架改造并完善而成的一套动态化方案&#xff0c;在开发体验上基本能与原生RN保持一致&#xff0c;同时从业务需求的角度满足从开发、构建、测试、部署、运维的工程化需要。解决了一系列痛点…

论文浅尝 | 使用预训练深度模型和迁移学习方法的端到端模糊实体匹配

论文笔记整理&#xff1a;高凤宁&#xff0c;南京大学硕士&#xff0c;研究方向为知识图谱、实体消解。链接&#xff1a;https://doi.org/10.1145/3308558.3313578动机目前实体匹配过程中实体之间的差异比较微妙&#xff0c;不同的情况下可能会有不同的决策结果&#xff0c;导致…

推荐几个Android开发非常有用的工具(for android studio)

原文地址: http://stormzhang.com/android/2015/05/26/android-tools/ 一晃好久没更新博客了&#xff0c;最近一个月真的很忙&#xff0c;因为公司在准备C轮融资&#xff0c;公司的发展到了一个关键的阶段&#xff0c;自己全部精力投入在公司产品上&#xff0c;这个状态可能还会…

分布式机器学习(下)-联邦学习

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/114028503 本视频来源于Shusen Wang讲解的《分布式机器学习》&#xff0c;总共有三讲&#xff0c;内容和连接如下&#xff1a;并行计算与机器学习&#xff08;上&#xff09;并行计算与机器学习&#xff08;下&#xff09;联…

LeetCode 8. 字符串转换整数 (atoi)

文章目录1. 题目2. 解题1. 题目 示例 1: 输入: "42" 输出: 42示例 2: 输入: " -42" 输出: -42 解释: 第一个非空白字符为 -, 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来&#xff0c;最后得到 -42 。示例 3: 输入: "4193 w…

怎样将Embedding融入传统机器学习框架?

文 | 石塔西源 | 知乎LR本身是一个经典的CTR模型&#xff0c;广泛应用于推荐/广告系统。输入的特征大多数是离散型/组合型。那么对于Embedding技术&#xff0c;如何在不使用深度学习模型的情况下&#xff08;假设就是不能用DNN&#xff09;&#xff0c;融入到LR框架中呢&#x…

推荐系统中的Embedding

推荐系统之Embedding一、什么是embedding&#xff1f;1. 让embedding空前流行的word2vec&#xff1a;2. 从word2vec到item2vec二、Graph Embedding1. 经典的Graph Embedding方法 — DeepWalk2. DeepWalk改进 — Node2vec3. 阿里的Graph Embedding方法EGES三、深度学习推荐系统中…

美团下一代服务治理系统 OCTO 2.0 的探索与实践

本文根据美团基础架构部服务治理团队工程师郭继东在2019 QCon&#xff08;全球软件开发大会&#xff09;上的演讲内容整理而成&#xff0c;主要阐述美团大规模治理体系结合 Service Mesh 演进的探索实践&#xff0c;希望对从事此领域的同学有所帮助。 一、OCTO 现状分析 OCTO 是…

技术动态 | 跨句多元关系抽取

本文转载自公众号&#xff1a;知识工场。第一部分 概述关系抽取简介关系抽取是从自由文本中获取实体间所具有的语义关系。这种语义关系常以三元组 <E1,R,E2> 的形式表达&#xff0c;其中&#xff0c;E1 和E2 表示实体&#xff0c;R 表示实体间所具有的语义关系。如图1所示…

JAVA1.6实现动态编译加载运行

一直以为我们写好的程序都需要预先编译好&#xff0c;然后再运行&#xff0c;直到今天在看书的时候才看到书上说JAVA1.6之后可以动态的编译JAVA文件&#xff0c;这着实让我高兴了一把&#xff0c;为什么这么兴奋呢&#xff0c;我一心想着能用技术实现动态更新APK&#xff0c;不…

网络解析(一):LeNet-5详解

原文链接&#xff1a;https://cuijiahua.com/blog/2018/01/dl_3.html 2018年1月9日21:03:313994,282 C摘要LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition&#xff0c;是一种用于手写体字符识别的非常高效的卷积神经网络。一、前言LeNet-5出自论文Gr…

LeetCode 69. x 的平方根(二分查找)

文章目录1. 题目2.解题2.1 二分查找2.2 牛顿迭代1. 题目 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根&#xff0c;其中 x 是非负整数。 由于返回类型是整数&#xff0c;结果只保留整数的部分&#xff0c;小数部分将被舍去。 示例 1:输入: 4 输出: 2 示例 2:输入: 8…

(设计模式)简单工厂模式之通过配置文件动态创建实现类

通常我们在使用简单工厂模式的时候会由创建方法create通过传入的参数来判断要实例化哪个对象&#xff0c;就像下面这样&#xff1a; public static class ImageSelectFactory {public static IImageSelect createIImageSelect(ImageSelectClientMode mode) {IImageSelect image…

Google综述:细数Transformer模型的17大高效变种

文 | 黄浴来源 | 知乎在NLP领域transformer已经是成功地取代了RNN&#xff08;LSTM/GRU&#xff09;&#xff0c;在CV领域也出现了应用&#xff0c;比如目标检测和图像加注&#xff0c;还有RL领域。这是一篇谷歌2020年9月份在arXiv发表的综述论文 “Efficient Transformers: A …

Tensorflow2.0模型构建与训练

模型构建 class Encoder(layers.Layer):def __init__(self, latent_dim32, intermediate_dim64, name"encoder", **kwargs):super(Encoder, self).__init__(namename, **kwargs)w_init tf.random_normal_initializer()self.w tf.Variable(initial_valuew_init(shap…

从ReentrantLock的实现看AQS的原理及应用

前言 Java中的大部分同步类&#xff08;Lock、Semaphore、ReentrantLock等&#xff09;都是基于AbstractQueuedSynchronizer&#xff08;简称为AQS&#xff09;实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到…

论文浅尝 | 利用知识-意识阅读器改进的不完整知识图谱问答方法

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为知识库问答。来源&#xff1a;ACL2019链接&#xff1a;https://www.aclweb.org/anthology/P19-1417/本文提出了一种融合不完整知识图谱与文档集信息的end2end问答模型&#xff0c;旨在利用结构…