软件编程
位置:首页>> 软件编程>> Android编程>> Android开发使用Databinding实现关注功能mvvp

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>

显示效果

Android开发使用Databinding实现关注功能mvvp

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com