android学习笔记(五)-MVP模式

1、MVP模式demo的实现,效果下:

2、创建一个Fruit类:

package com.example.listview;
//Fruit类就是Model,表示应用程序中的数据对象。
public class Fruit {private int imageId;private String name;private String price;public Fruit(int imageId, String name, String price) {this.imageId = imageId;this.name = name;this.price = price;}public int getImageId() {return imageId;}public String getName() {return name;}public String getPrice() {return price;}
}

 3、创建FruitAdapter适配器:

package com.example.listview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public FruitAdapter(Context context, int resourceId, List<Fruit> objects) {super(context, resourceId, objects);this.resourceId = resourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Fruit fruit = getItem(position);View view;ViewHolder viewHolder;if (convertView == null) {view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);viewHolder = new ViewHolder();viewHolder.fruitImage = view.findViewById(R.id.fruit_image);viewHolder.fruitName = view.findViewById(R.id.fruit_name);viewHolder.fruitPrice = view.findViewById(R.id.fruit_price);view.setTag(viewHolder);} else {view = convertView;viewHolder = (ViewHolder) view.getTag();}viewHolder.fruitImage.setImageResource(fruit.getImageId());viewHolder.fruitName.setText(fruit.getName());viewHolder.fruitPrice.setText("价格: " + fruit.getPrice() + "元/斤");return view;}static class ViewHolder {ImageView fruitImage;TextView fruitName;TextView fruitPrice;}
}

4、创建MainView接口,用于显示UI界面。

package com.example.listview;
import java.util.List;
//定义View,负责UI的展示和用户交互。
public interface MainView {void displayFruits(List<Fruit> fruitList);
}

 5、创建Presenter:

package com.example.listview;
import java.util.ArrayList;
import java.util.List;
//定义Presenter,用于处理业务逻辑和用户输入。
public class MainPresenter {private MainView view;private List<Fruit> fruitList;public MainPresenter(MainView view) {this.view = view;fruitList = generateFruitData();}public void loadFruits() {view.displayFruits(fruitList);}private List<Fruit> generateFruitData() {List<Fruit> fruitList = new ArrayList<>();fruitList.add(new Fruit(R.drawable.pineapple,"菠萝", "68"));fruitList.add(new Fruit(R.drawable.strawberry,"草莓", "55"));fruitList.add(new Fruit(R.drawable.orange,"橙子", "36"));fruitList.add(new Fruit(R.drawable.longan,"桂圆", "78"));fruitList.add(new Fruit(R.drawable.cantaloupe,"哈密瓜", "99"));fruitList.add(new Fruit(R.drawable.dragon_fruit,"火龙果", "128"));fruitList.add(new Fruit(R.drawable.kiwi, "猕猴桃", "90"));fruitList.add(new Fruit(R.drawable.lemon,"柠檬", "56"));fruitList.add(new Fruit(R.drawable.loquat, "枇杷", "81"));fruitList.add(new Fruit(R.drawable.apple, "苹果", "160"));fruitList.add(new Fruit(R.drawable.mandarin_orange, "砂糖桔", "150"));fruitList.add(new Fruit(R.drawable.pomelo, "樱桃", "200"));fruitList.add(new Fruit(R.drawable.tomato, "柚子", "62"));fruitList.add(new Fruit(R.drawable.cherry, "西红柿", "60"));fruitList.add(new Fruit(R.drawable.pineapple,"菠萝", "68"));fruitList.add(new Fruit(R.drawable.strawberry,"草莓", "55"));fruitList.add(new Fruit(R.drawable.orange,"橙子", "36"));fruitList.add(new Fruit(R.drawable.longan,"桂圆", "78"));fruitList.add(new Fruit(R.drawable.cantaloupe,"哈密瓜", "99"));fruitList.add(new Fruit(R.drawable.dragon_fruit,"火龙果", "128"));fruitList.add(new Fruit(R.drawable.kiwi, "猕猴桃", "90"));fruitList.add(new Fruit(R.drawable.lemon,"柠檬", "56"));fruitList.add(new Fruit(R.drawable.loquat, "枇杷", "81"));fruitList.add(new Fruit(R.drawable.apple, "苹果", "160"));fruitList.add(new Fruit(R.drawable.mandarin_orange, "砂糖桔", "150"));fruitList.add(new Fruit(R.drawable.pomelo, "樱桃", "200"));fruitList.add(new Fruit(R.drawable.tomato, "柚子", "62"));fruitList.add(new Fruit(R.drawable.cherry, "西红柿", "60"));return fruitList;}
}

6、在MainActivity中实现MVP模式的业务逻辑:

package com.example.listview;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
//Model:负责数据的管理和处理。
//View:负责UI的展示和用户交互。
//Presenter:连接Model和View,处理业务逻辑和用户输入。
//Presenter在加载数据后通过MainView接口回调通知View显示水果列表。
public class MainActivity extends AppCompatActivity implements MainView {private ListView listView;private FruitAdapter adapter;private MainPresenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = findViewById(R.id.list_view);presenter = new MainPresenter(this);presenter.loadFruits();}@Overridepublic void displayFruits(List<Fruit> fruitList) {adapter = new FruitAdapter(this, R.layout.item_fruit, fruitList);listView.setAdapter(adapter);listView.setOnItemClickListener((parent, view, position, id) -> {Fruit fruit = fruitList.get(position);showFruitDetails(fruit);});}private void showFruitDetails(Fruit fruit) {Toast.makeText(MainActivity.this, "名称: " + fruit.getName() + ", 价格: " + fruit.getPrice() + "元/斤", Toast.LENGTH_SHORT).show();}
}

7、activity_main.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>

8、item_fruit.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="16dp"><ImageViewandroid:id="@+id/fruit_image"android:layout_width="64dp"android:layout_height="64dp"android:scaleType="centerCrop"android:src="@mipmap/ic_launcher" /><LinearLayoutandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="vertical"android:layout_marginStart="16dp"><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:textStyle="bold"android:text="水果名称" /><TextViewandroid:id="@+id/fruit_price"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="14sp"android:textColor="@android:color/darker_gray"android:text="价格: " /></LinearLayout></LinearLayout>

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

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

相关文章

代码随想录算法训练营Day6 | 242.有效的字母异位词 ●349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

基础&#xff1a; 1.哈希表是根据关键值进行直接访问的数据结构&#xff0c;时间复杂度是O(1)&#xff0c;也就是通过数组的索引下标&#xff0c;直接访问数组中的元素哈希表的作用就是用来快速判断一个元素是否出现在集合里。 2.常见的哈希结构&#xff1a; 数组set &#…

计算机视觉 | 交通信号灯状态的检测和识别

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在使用计算机视觉技术检测交通信号灯的状态&#xff0c;主要针对红色和绿色信号灯的识别。通过分析输入图像中的像素颜色信息&#xff0c;利用OpenCV库实现对信号灯状态的检测和识别。 目录 一、项目背景 二、项目功能…

CalcPad(2) 单位设置和绘制图表

CalcPad(2) 单位设置和绘制图表 Hi uu们&#xff0c;CalcPad用的还好吗&#xff1f;有发现一些问题吗&#xff1f; 在我的使用中&#xff0c;经常需要指定一些计算结果的符号&#xff0c;比如说我希望ADC最小分辨率的计算结果是以uV展示&#xff0c;那我们该怎么操作呢&#…

DB索引B+树SQL优化

数据库的索引就像一本书的目录&#xff0c;查数据快人一步&#xff0c;快速定位&#xff0c;精准打击&#xff01; 什么是数据库的索引&#xff1f; 官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说&#xff0c;数据库索引好比是一本书前面的目录&#xff0c;能加…

入坑 Node.js 1

原文&#xff1a;https://blog.iyatt.com/?p14717 前言 前面刚刚对 Spring Boot 有了个概念&#xff0c;再来学学 Node.js&#xff0c;顺便当学 JavaScript&#xff0c;为后面入前端做准备。 环境 Node.js 20.12.2 官方 API 文档&#xff1a;https://nodejs.org/docs/lat…

IBM SPSS Statistics for Mac:强大的数据分析软件

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

day_8题解

利用最大公约数求最小公倍数 #include<iostream> using namespace std;int gcd(int a,int b) {return b?gcd(b,a%b):a; }int main() {long long a,b;cin>>a>>b;long long ansgcd(a,b);cout<<(a*b)/ans<<endl;return 0; }排序遍历&#xff0c;记…

支持中文繁体,支持同时配置并启用飞书和Lark认证,JumpServer堡垒机v3.10.8 LTS版本发布

2024年4月22日&#xff0c;JumpServer开源堡垒机正式发布v3.10.8 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本&#xff0c;以获得更佳的使用体验。 在v3.10.8 LTS版本中&…

一款支持串口、网口自定义协议的调试软件

ComMax通讯调试软件是一款支持自定义串口&#xff0c;网口通讯协议的调试软件&#xff0c;用户可以根据需要&#xff0c;自定义协议包&#xff0c;然后根据接受的数据选择要发送的数据包。是一款强大、好用的调试软件。 点击下载 提取码&#xff1a;wmfg 不用安装 下载解压即…

《史铁生》-随记

史铁生的文案进一段总是刷到&#xff0c;文字在某些时候真的是一种无形的动力。小时候学过的书&#xff0c;长大了才会更加理解其中的蕴意。如看到的文字所说&#xff0c;教育具有长期性和滞后性&#xff0c;就像一个闭环&#xff0c;多年后你有一个瞬间突然意识到什么&#xf…

怎么通过微信小程序实现远程控制包间内的电器

怎么通过微信小程序实现远程控制包间内的电器呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制包间内的电器&#xff0c;专用的包间控制器&#xff0c;可独立控制包间内的全部电器&#xff0c;包括空调。 可选用产品&#xff1a;可根据实际场景需求&…

ChatGPT在线网页版(与GPT Plus会员完全一致)

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

假设检验分析方法

目录 1.什么是假设检验分析方法 2.作用 3.使用 1.什么是假设检验分析方法 在数据分析中&#xff0c;假设检验是一种统计方法&#xff0c;用于确定样本数据是否支持对总体参数的某种假设。此法在数据分析中被广泛应用&#xff0c;可以帮助研究人员进行科学的推断和决策&#…

【bug】使用mmsegmentaion遇到的问题

利用mmsegmentaion跑自定义数据集时的bug处理&#xff08;使用bisenetV2&#xff09; 1. ValueError: val_dataloader, val_cfg, and val_evaluator should be either all None or not None, but got val_dataloader{batch_size: 1, num_workers: 4}, val_cfg{type: ValLoop}, …

visionTransformer window平台下报错

错误&#xff1a; KeyError: Transformer/encoderblock_0/MlpBlock_3/Dense_0kernel is not a file in the archive解决方法&#xff1a; 修改这个函数即可&#xff0c;主要原因是Linux系统与window系统路径分隔符不一样导致 def load_from(self, weights, n_block):ROOT f&…

配置 rust国内源

rust crate.io 配置国内源&#xff08;cargo 国内源&#xff09; warning: spurious network error (2 tries remainin..._warning: spurious network error (3 tries remaining-CSDN博客

YOLOv5改进 | Conv篇 | 利用CVPR2024-DynamicConv提出的GhostModule改进C3(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是CVPR2024的最新改进机制DynamicConv其是CVPR2024的最新改进机制&#xff0c;这个论文中介绍了一个名为ParameterNet的新型设计原则&#xff0c;它旨在在大规模视觉预训练模型中增加参数数量&#xff0c;同时尽量不增加浮点运算&#x…

orbslam2+kitti数据集序列图像

文章目录 一、下载ORB Slam2依赖二、安装编译ORB_SLAM2三 、运行Kitee数据集3.1 数据集准备3.2 启动&#xff01;&#xff01;&#xff01; 安装ORB Slam2遇到的问题总结参考资料 一、下载ORB Slam2依赖 Orb Slam2 需要下载的依赖项&#xff1a; Pangolin0.5 、Eigen3.1以上、…

跨语言大模型最新综述

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

jmeter5.4.1源码编译(IDEA)问题解决

问题现象&#xff1a;最近想更深入的研究下jmeter5.4.1的原理及功能具体实现&#xff0c;从官网down了个源码&#xff0c;在本地使用IDEA工具导入项目、编译时&#xff0c;报以下错误&#xff1a; class jdk.internal.loader.ClassLoaders$PlatformClassLoader cannot be cast…