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;
    }

    @Override
    public 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;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.list_view);
        presenter = new MainPresenter(this);
        presenter.loadFruits();
    }

    @Override
    public 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">

    <ListView
        android: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">

    <ImageView
        android:id="@+id/fruit_image"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:layout_marginStart="16dp">

        <TextView
            android:id="@+id/fruit_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:textStyle="bold"
            android:text="水果名称" />

        <TextView
            android: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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查找算法之插值查找

目录 前言一、查找算法预备知识二、插值查找三、总结3.1 查找性能3.2 适用场景 前言 查找算法是一种用于在数据集合中查找特定元素的算法。在计算机科学中&#xff0c;查找算法通常被用于在数组、链表、树等数据结构中查找目标元素的位置或者判断目标元素是否存在。 查找算法的…

基础SQL DML-插入语句

插入语句前&#xff0c;我们先创建一个表。表的创建在DDL语句里面涉及&#xff0c;可以参考&#xff1a;小赖同学吖-CSDN博客 我们创建一个员工表进行数据的插入操作 插入&#xff08;添加&#xff09;语句的语法 给员工表添加一条记录 给员工表添加多条记录 也可以通过下面的方…

Linux文件chattr/lsattr/Linux权限(搭建权限测试环境实战)引申到内部原理及Linux删除系统文件原理-7539字详谈

企业高薪思维: 每一个阶段什么时候是最重要的&#xff1f;&#xff08;快速定位&#xff09; 1.学习最重要的事情 &#xff08;学生阶段&#xff0c;找工作前阶段&#xff09; 2.家庭&#xff0c;女朋友 &#xff08;工作阶段/学生阶段&#xff0c;学习不受到影响&#xff09; …

浅析binance新币OMNI的前世今生

大盘跌跌不休&#xff0c;近期唯一的指望就是binance即将上线的OMNI 。虽然目前查到的空投数量不及预期&#xff0c;但OMNI能首发币安&#xff0c;确实远超预期了。 OMNI代币总量1亿&#xff0c;初始流通仅10,391,492枚&#xff0c;其中币安Lanchpool可挖350万枚 对于OMNI这个…

OneNote插件推荐(OneMore)

使用OneNote编辑笔记时希望有一个插件能够实现markdown的功能&#xff0c;于是发现了OneMark&#xff0c;后面用着用着&#xff0c;OneMark竟然收费了&#xff0c;于是苦苦找寻好用的markdown插件&#xff0c;无果&#xff0c;此时发现我的目标主要是实现对代码的格式化&#x…

洛谷 -P1007 独木桥(模拟,思维)

独木桥 题目背景 战争已经进入到紧要时间。你是运输小队长&#xff0c;正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激&#xff0c;于是命令你的士兵们到前方的一座独木桥上欣赏风景&#xff0c;而你留在桥下欣赏士兵们。士兵们十分愤怒&#xf…

VMware 15 虚拟机网络遇到的问题

剧情提要 通过Cent os7 的镜像文件&#xff0c;创建了一个虚拟机A&#xff08;后面简称A&#xff09;&#xff0c;事后发现&#xff0c;宿主机无法ping通A 在虚拟机中通过IP a 看到的IP信息也没有只管的ip信息如图 然后执行&#xff0c;宿主机才能访问A。 sudo dhclient ens…

前端css中的transform(转换)的使用

前端css中的transform的使用 一、前言二、流程图三、举例&#xff08;一&#xff09;、平移1.平移&#xff0c;源码12.源码1运行效果(1).视频效果(2).截图效果 3.平移3d效果&#xff0c;源码24.源码2运行效果&#xff08;1&#xff09;、视频效果&#xff08;2&#xff09;、截…

如何使用RRT模式进行交易,Anzo Capital一篇文章说清楚

railway tracks烛台模式(或铁路线 - RRT)是一种基于价格行为的简单交易策略&#xff0c;这种策略交易原理相当简单&#xff0c;易于使用。 RRT烛台形态也是图表上经常出现的形态&#xff0c;如果知道如何使用它&#xff0c;Anzo Capital认为它就是具有强烈交易信号的形态。 …

要提升B端管理系统颜值,登录页就是第一道门面,必须升级

登录页是B端管理系统门面&#xff0c;对于系统的品牌形象、辨识度、品质展示等有着不可替代的作用&#xff0c;是B端管理系统升级的必备页面&#xff0c;这里面有什么原因呢&#xff1f;10年经验的老司机→贝格前端工场为您分析一下。 一、登录页对于系统形象的重要性 B端管理…

SLS 查询新范式:使用 SPL 对日志进行交互式探索

作者&#xff1a;无哲 引言 在构建现代数据和业务系统的过程中&#xff0c;可观测性已经变得至关重要&#xff0c;日志服务&#xff08;SLS&#xff09;为 Log/Trace/Metric 数据提供了大规模、低成本、高性能的一站式平台服务&#xff0c;并提供数据采集、加工、投递、分析、…

合约X—314协议系统开发

随着区块链技术的不断发展&#xff0c;越来越多的协议被提出和应用&#xff0c;其中X314协议就是其中之一。该协议旨在通过去中心化、安全性和可扩展性等方面&#xff0c;为区块链应用提供更好的支持。本文将从多个角度对X314协议进行深度解析&#xff0c;探讨其优势和不足&…

牛客NC162 二叉树中和为某一值的路径(三)【中等 dfs C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/965fef32cae14a17a8e86c76ffe3131f 思路 既然要找所有路径上节点和等于目标值的路径个数&#xff0c;那我们肯定先找这样的路径起点啊&#xff0c; 但是我们不知道起点究竟在哪里&#xff0c; 而且任意节点都有…

【机器学习】《机器学习建模基础》笔记

文章目录 单元0 前言单元1 数学建模与机器学习学习目标&#xff08;一&#xff09;什么是模型&#xff08;二&#xff09;数学模型的分类&#xff08;三&#xff09;数学建模的一般步骤&#xff08;四&#xff09;机器学习的概念&#xff08;五&#xff09;机器学习的分类&…

CTF-reverse-simpleRE(base64变表逆向)

题目链接 NSSCTF | 在线CTF平台 题目详情 [HUBUCTF 2022 新生赛]simple_RE 解题报告 下载得到的文件使用ida64分析&#xff0c;如果报错就换ida32&#xff0c;得到分析结果&#xff0c;有main函数就先看main main函数分析 main函数的逻辑看下来十分简单&#xff0c;因此关键…

机器学习(三)之监督学习2

前言&#xff1a; 本专栏一直在更新机器学习的内容&#xff0c;欢迎点赞收藏哦&#xff01; 笔者水平有限&#xff0c;文中掺杂着自己的理解和感悟&#xff0c;如果有错误之处还请指出&#xff0c;可以在评论区一起探讨&#xff01; 1.支持向量机&#xff08;Support Vector Ma…

混淆原理与实践指南

引言 &#x1f680; 在当今的软件开发领域&#xff0c;保护代码的安全性和保密性变得越来越重要。混淆&#xff08;Obfuscation&#xff09;技术作为一种保护代码的手段&#xff0c;在应对逆向工程和代码盗用方面发挥着关键作用。本文将深入探讨混淆的原理&#xff0c;以及如何…

【Flutter】One or more plugins require a higher Android SDK version.

问题描述 项目里多个组件需要更高版本的Android SDK One or more plugins require a higher Android SDK version.解决方案&#xff1a; 报错提示requires Android SDK version 34 按提示修改android项目app里build.gradle的compileSdkVersion 为34 android {compileSdkVe…

16.哀家要长脑子了!

目录 1. 707. 设计链表 - 力扣&#xff08;LeetCode&#xff09; 2.203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 3.206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 4.237. 删除链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 5. 19. 删除链…

实测数据的功率谱估计

目录 1.脉搏数据1.1 数据1的结果1.2 数据2的结果 2.振动加速度数据 1.脉搏数据 1.1 数据1的结果 1.2 数据2的结果 2.振动加速度数据