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.hqwc.cn/news/640422.html

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

相关文章

内存卡损坏难开启,数据恢复有妙招

故障初现&#xff1a;内存卡损坏难开启 在我们的日常生活中&#xff0c;内存卡作为一种常见的存储设备&#xff0c;承载着大量的照片、视频、文档等重要数据。然而&#xff0c;有时我们可能会遭遇这样的困境&#xff1a;当试图打开内存卡时&#xff0c;却发现它无法被正常识别…

Vitis HLS 学习笔记--优化指令-BIND_OP_STORAGE

目录 1. BIND_OP_STORAGE 概述 1.1 BIND_OP 1.2 BIND_STORAGE 2. 语法解析 2.1 BIND_OP 2.2 BIND_OP 用法示例 2.3 BIND_STORAGE 2.4 BIND_STORAGE 示例 3. 实例演示 4. 总结 1. BIND_OP_STORAGE 概述 BIND_OP_STORAGE 其实是两个优化指令的合称&#xff1a;BIND_OP…

Linux磁盘及读写数据原理/Raid技术/硬软raid及企业案例/磁盘分区环境搭建/格式化磁盘系列-12213字

高薪思维&#xff1a; 怎么才能一直去坚持下去&#xff1f; 1.做这件事情的好处&#xff0c;对自己一直去放大。 2.不做的坏处&#xff0c;并放大 3.学习痛苦&#xff1f;还是去上班&#xff08;餐饮、外卖痛苦&#xff1f;&#xff09; 用比学习更痛苦的事情&#xff0c;去对抗…

西瓜书学习——第一、二章笔记

文章目录 什么是机器学习?假设空间和版本空间基本术语机器学习任务分类 归纳偏好数据决定模型的上限&#xff0c;而算法则是让模型无限逼近上限评估方法留出法交叉验证法自助法调参与最终模型验证集和测试集的区别 性能度量均方误差错误率与精度查准率、查全率与F1ROC与AUC代价…

Python 实现 Mock 数据功能(模拟真实对象的行为)

当你需要在 Python 中测试某些代码时&#xff0c;有时你希望模拟&#xff08;或者说替换&#xff09;某些部分&#xff0c;以便更好地控制测试环境。这就是 Mock 功能的用武之地。Mock 对象可以模拟真实对象的行为&#xff0c;使你能够在测试中对其进行配置&#xff0c;以便更容…

函数模版实例化

目录 一、前言 二、 什么是C模板 &#x1f4a6;泛型编程的思想 &#x1f4a6;C模板的分类 三、函数模板 &#x1f4a6;函数模板概念 &#x1f4a6;函数模板格式 &#x1f4a6;函数模板的原理 &#x1f4a6;函数模板的实例化 &#x1f34e;隐式实例化 &#x1f349;显式实例化 …

揭秘链动3+1商业模式:打造未来商业新风潮

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是链动31模式&#xff1f; 在当今商业世界中&#xff0c;随着科技的飞速发展和消费者需求的不断升级&#xff0c;新的商业模式不断涌现。其中&a…

如何搭建一个vue2组件库(king-ui-pro)

文章引用图片无法查看&#xff0c;直接查看原文 感兴趣的可以关注或订阅下这个系列&#xff0c;后续会陆续将相关的组件与公共方法进行分享 目前已经完成了的组件有 多行省略pro版&#xff0c;不是简单的多行省略效果 公共方法&#xff1a; 1、图片预览&#xff0c;知乎的图…

leetcode(hot100)——贪心算法

55. 跳跃游戏 本题不用纠结于可以跳几步&#xff0c;可以聚焦于覆盖范围&#xff0c;即 当前位置当前跳数 能够覆盖的范围&#xff0c;若这个范围足以到达最后一个位置&#xff0c;则返回true&#xff1b;若for循环结束&#xff0c;则还没返回true&#xff0c;则返回false。 下…

苹果手机远程打卡教程

关于苹果手机远程打卡教程之——有电脑零成本版 &#x1f4ce;个人主页&#xff1a;我的主页 &#x1f4ce;小白一枚&#xff0c;欢迎指教&#x1f44f; 嗨嗨嗨&#xff0c;今天来出一期iPhone实现远程打卡的教程&#xff0c;让我们可以随时随地的打卡wherever&#xff5e; 准…

A4云打印仅需5分/页?云打印多少钱?云打印怎么收费?

随着互联网技术的发展&#xff0c;越来越多的同学在打印资料的时候都开始转向线上&#xff0c;转向云打印服务了。云打印服务不仅可以给我们节省很多时间&#xff0c;价格方面较打印店也更有优势。那么云打印多少钱&#xff1f;云打印怎么收费&#xff1f;今天小易就带大家来了…

了解IPS和IDS:这5个差异将改变你的安全观念!

IPS 代表 入侵防御系统&#xff08;Intrusion Prevention System&#xff09;&#xff0c;它是 IDS 的进一步发展&#xff0c;不仅具备检测攻击的能力&#xff0c;还能在检测到攻击后主动采取措施阻止攻击。IPS 通常部署在防火墙和网络设备之间&#xff0c;能够深度感知并检测流…