Android开发使用Databinding实现关注功能mvvp
作者:DavidMC 发布时间:2023-07-23 19:27:32
标签:Android,Databinding,mvvp,关注功能
说到关注功能,可能很多小伙伴要说了。谁不会写
但是没有合理的架构,大家写出来的代码很可能是一大堆的复制粘贴。比如十几个页面,都有这个关注按钮。然后,你是不是也要写十几个地方呢 然后修改的时候是不是也要修改十几个地方 我们是否考虑过一下几个问题?
可复用性 (是否重复代码和逻辑过多?)
可扩展性 (比如我这里是关注的人,传userId,下个地方又是文章 articleId)
可读性 冗余代码过多,势必要影响到可读性。
然后再看下自己写的代码,是否会面临上面的几个问题呢?是否有一种优雅的方式。帮我们一劳永逸。我这里给出一个解决方案是 使用Databinding ,如果对databinding使用不熟悉的,建议先去熟悉一下databinding用法
目标
我们要实现的目标是,希望能让关注这快的业务逻辑实现最大程度复用,在所有有关注按钮布局的页面,只需要引入一个同一个vm。实现关注和非关注状态逻辑的切换
Modle
下面以关注人来做为示例
要有两种状态,实体bean要继承自BaseObservable。配合databing实现mvvm效果,属性需要定义为@Bindable,当属性发生变化的时候,调用notifyPropertyChanged(属性ID)
public class User extends BaseObservable implements Serializable {
public boolean hasFollow;//是否关注,是和否
@Bindable
public boolean isHasFollow() {
return hasFollow;
}
public void setHasFollow(boolean hasFollow) {
this.hasFollow = hasFollow;
notifyPropertyChanged(com.mooc.ppjoke.BR._all);
}
}
页面布局如下
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="feed"
type="com.mooc.ppjoke.model.Feed" />
<variable
name="leftMargin"
type="java.lang.Integer" />
<variable
name="fullscreen"
type="java.lang.Boolean" />
<import type="com.mooc.ppjoke.utils.TimeUtils" />
<import type="com.mooc.ppjoke.ui.InteractionPresenter"></import>
<variable
name="owner"
type="androidx.lifecycle.LifecycleOwner" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/author_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:orientation="vertical"
android:paddingLeft="@{leftMargin}"
android:paddingTop="@dimen/dp_3"
android:paddingBottom="@dimen/dp_3">
<com.mooc.ppjoke.view.PPImageView
android:id="@+id/author_avatar"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_1"
app:image_url="@{feed.author.avatar}"
app:isCircle="@{true}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/icon_splash_text"></com.mooc.ppjoke.view.PPImageView>
<TextView
android:id="@+id/author_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="@dimen/dp_3"
android:text="@{feed.author.name}"
android:textColor="@{fullscreen?@color/color_white:@color/color_000}"
android:textSize="@dimen/sp_14"
android:textStyle="bold"
app:layout_constraintLeft_toRightOf="@+id/author_avatar"
app:layout_constraintTop_toTopOf="parent"
tools:text="Title"></TextView>
<TextView
android:id="@+id/create_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="@dimen/dp_2"
android:text="@{TimeUtils.calculate(feed.createTime)}"
android:textColor="@{fullscreen?@color/color_white:@color/color_000}"
android:textSize="@dimen/sp_12"
android:textStyle="normal"
app:layout_constraintLeft_toRightOf="@+id/author_avatar"
app:layout_constraintTop_toBottomOf="@+id/author_name"
tools:text="3天前"></TextView>
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/dp_16"
android:backgroundTint="@{fullscreen?@color/transparent:@color/color_theme}"
android:gravity="center"
android:onClick="@{()->InteractionPresenter.toggleFollowUser(owner,feed)}"
android:paddingLeft="@dimen/dp_16"
android:paddingTop="@dimen/dp_5"
android:paddingRight="@dimen/dp_16"
android:paddingBottom="@dimen/dp_5"
android:text="@{feed.author.hasFollow?@string/has_follow:@string/unfollow}"
android:textColor="@color/color_white"
android:textSize="@dimen/sp_14"
app:backgroundTint="@color/color_theme"
app:cornerRadius="@dimen/dp_13"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:strokeColor="@{fullscreen?@color/color_white:@color/transparent}"
app:strokeWidth="1dp"
tools:text="已关注" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
显示效果
Presenter
package com.mooc.ppjoke.ui;
import android.app.Application;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.arch.core.executor.ArchTaskExecutor;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mooc.libcommon.extention.LiveDataBus;
import com.mooc.libcommon.global.AppGlobals;
import com.mooc.libnetwork.ApiResponse;
import com.mooc.libnetwork.ApiService;
import com.mooc.libnetwork.JsonCallback;
import com.mooc.ppjoke.model.Comment;
import com.mooc.ppjoke.model.Feed;
import com.mooc.ppjoke.model.TagList;
import com.mooc.ppjoke.model.User;
import com.mooc.ppjoke.ui.login.UserManager;
import com.mooc.ppjoke.ui.share.ShareDialog;
import org.jetbrains.annotations.NotNull;
import java.util.Date;
public class InteractionPresenter {
//关注/取消关注一个用户
private static void toggleFollowUser(LifecycleOwner owner,User user) {
ApiService.get("/ugc/toggleUserFollow")
.addParam("followUserId", UserManager.get().getUserId())
.addParam("userId", feed.author.userId)
.execute(new JsonCallback<JSONObject>() {
@Override
public void onSuccess(ApiResponse<JSONObject> response) {
if (response.body != null) {
boolean hasFollow = response.body.getBooleanValue("hasLiked");
user.setHasFollow(hasFollow);
LiveDataBus.get().with(DATA_FROM_INTERACTION)
.postValue(feed);
}
}
@Override
public void onError(ApiResponse<JSONObject> response) {
showToast(response.message);
}
});
}
}
综上已经实现了简单的用户关注功能。activity不需要做任何事情。
来源:https://juejin.cn/post/7142678611810582558


猜你喜欢
- public class OracleJdbcTest { &nbs
- 1、SDK下载很慢。配置SDK代理,速度像飞一样。建议先把20-24下完,不然后面遇到很多问题。2、support-v7的问题例如res\v
- 写完布局后 我们一般需要 findViewById找到这个控件,但是现在有一个很好用的插件ButterKnife 可以一键转化布局文件中的所
- Android能用来存储的地方有两个,一个是手机内置的存储空间,一个是外置的SD卡,内置的存储空间一般比较小,所以应用的缓存建议存储在外置的
- 本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值。分享给大家供大家参考之用。具体分析如下:一
- 加密配置文件的SQL账号密码一般项目的配置文件里的信息都是明文的,导致有时候比较敏感的信息也直接暴露得超级明显,比如SQL的链接 账号 密码
- 如下:public Object invokeMethod(String className, String methodName,Obje
- 本文给大家分享Android里应用版本更新功能这一块的实现。一个好的应用软件都是需要好的维护,从初出版本到最后精品,这个过程需要版本不停的更
- Spring Batch job任务只跑一次在一次实际使用spring batch的过程中,在定时任务中,第一次执行Job没有出现问题,然后
- 前言有些业务比较复杂,比如我们需要新建10张表,每张表有10个字段,如果用手工来操作,肯定非常浪费时间,而且随着代码中对实体类的修改,还要同
- 今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误。P
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 1、什么是GOCW 为了解决在Csharp下编写OpenCV程序的问题,我做过比
- TreeWidget 目录树组件,该组件适用于创建和管理目录树结构,在开发中我们经常会把它当作一个升级版的ListView组件使用,因为Li
- 本文实例讲述了Android编程设计模式之状态模式。分享给大家供大家参考,具体如下:一、介绍状态模式中的行为是由状态来决定的,不同的状态下有
- Java中的比较问题是一个很基础又很容易混淆的问题。今天就几个容易出错的点作一个比较详细的归纳与整理,希望对大家的学习与面试有帮助。一、==
- 前言网上百度了很多FTP的java 工具类,发现文章代码都比较久远,且代码臃肿,即使搜到了代码写的还可以的,封装的常用操作方法不全面,于是自
- 上传临时文件被删除引起报错的解决1.前言在项目中使用到了SpringBoot的上传实现了一个excel导入功能,上线后稳得一批,但突然有一天
- 工作原理:Spring Cloud框架下的服务发现Eureka包含两个组件分别是: Eureka Server与Eureka ClientE
- 摘要:在spring boot中 MVC这部分也有默认自动配置,也就是说我们不用做任何配置,那么也是OK的,这个配置类就是 WebMvcAu