Android开发使用Databinding实现关注功能mvvp
作者:DavidMC 时间:2023-07-23 19:27:32
说到关注功能,可能很多小伙伴要说了。谁不会写
但是没有合理的架构,大家写出来的代码很可能是一大堆的复制粘贴。比如十几个页面,都有这个关注按钮。然后,你是不是也要写十几个地方呢 然后修改的时候是不是也要修改十几个地方 我们是否考虑过一下几个问题?
可复用性 (是否重复代码和逻辑过多?)
可扩展性 (比如我这里是关注的人,传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
标签:Android,Databinding,mvvp,关注功能
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
GridView基于pulltorefresh实现下拉刷新 上拉加载更多功能(推荐)
2022-08-29 23:51:58
c# 反射+自定义特性保存数据至本地
2023-03-14 03:07:40
c# 委托和事件实例学习
2023-07-04 06:25:58
Android线性布局与相对布局的实现
2021-07-26 09:08:01
![](https://img.aspxhome.com/file/2023/2/138552_0s.jpg)
Android编程实现全局获取Context及使用Intent传递对象的方法详解
2022-02-27 08:50:13
Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程
2023-03-21 21:22:27
![](https://img.aspxhome.com/file/2023/6/61816_0s.png)
git版本回退_动力节点Java学院整理
2022-06-21 13:26:10
![](https://img.aspxhome.com/file/2023/4/112064_0s.png)
详解Dagger2在Android开发中的新用法
2021-08-23 22:39:40
C#将Json解析成DateTable的方法
2022-11-19 20:10:42
Android onClick方法与setOnClickListener方法对比
2022-02-09 22:21:40
java的各种类型转换全部汇总(推荐)
2022-03-01 01:25:43
详解JAVA动态代理
2023-11-24 22:52:04
Flyway详解及Springboot集成Flyway的详细教程
2022-09-21 10:37:49
![](https://img.aspxhome.com/file/2023/4/70304_0s.jpg)
java -jar设置添加启动参数实现方法
2022-04-26 21:05:37
QT实现用户登录注册
2022-07-10 08:21:57
![](https://img.aspxhome.com/file/2023/3/124053_0s.jpg)
Java线程安全中的有序性浅析
2023-07-12 03:07:58
![](https://img.aspxhome.com/file/2023/4/96114_0s.png)
C#多线程及同步示例简析
2022-02-25 22:12:43
![](https://img.aspxhome.com/file/2023/2/92952_0s.png)
Java中CyclicBarrier 循环屏障
2021-11-24 08:22:24
![](https://img.aspxhome.com/file/2023/3/76223_0s.png)
在web.config和app.config文件中增加自定义配置节点的方法
2021-11-03 03:21:41
JFinal实现伪静态的方法
2023-07-17 12:11:37
![](https://img.aspxhome.com/file/2023/0/57630_0s.jpg)