一文教你如何使用Databinding寫(xiě)一個(gè)關(guān)注功能
前言
但是沒(méi)有合理的架構(gòu),大家寫(xiě)出來(lái)的代碼很可能是一大堆的復(fù)制粘貼。比如十幾個(gè)頁(yè)面,都有這個(gè)關(guān)注按鈕。然后,你是不是也要寫(xiě)十幾個(gè)地方呢 然后修改的時(shí)候是不是也要修改十幾個(gè)地方 我們是否考慮過(guò)一下幾個(gè)問(wèn)題?
- 可復(fù)用性 (是否重復(fù)代碼和邏輯過(guò)多?)
- 可擴(kuò)展性 (比如我這里是關(guān)注的人,傳userId,下個(gè)地方又是文章 articleId)
- 可讀性 冗余代碼過(guò)多,勢(shì)必要影響到可讀性。
然后再看下自己寫(xiě)的代碼,是否會(huì)面臨上面的幾個(gè)問(wèn)題呢?是否有一種優(yōu)雅的方式。幫我們一勞永逸。我這里給出一個(gè)解決方案是 使用Databinding ,如果對(duì)databinding使用不熟悉的,建議先去熟悉一下databinding用法
目標(biāo)
我們要實(shí)現(xiàn)的目標(biāo)是,希望能讓關(guān)注這快的業(yè)務(wù)邏輯實(shí)現(xiàn)最大程度復(fù)用,在所有有關(guān)注按鈕布局的頁(yè)面,只需要引入一個(gè)同一個(gè)vm。實(shí)現(xiàn)關(guān)注和非關(guān)注狀態(tài)邏輯的切換
Modle
下面以關(guān)注人來(lái)做為示例:
要有兩種狀態(tài),實(shí)體bean要繼承自BaseObservable。配合databing實(shí)現(xiàn)mvvm效果,屬性需要定義為@Bindable,當(dāng)屬性發(fā)生變化的時(shí)候,調(diào)用notifyPropertyChanged(屬性ID)
public class User extends BaseObservable implements Serializable {
public boolean hasFollow;//是否關(guān)注,是和否
@Bindable
public boolean isHasFollow() {
return hasFollow;
}
public void setHasFollow(boolean hasFollow) {
this.hasFollow = hasFollow;
notifyPropertyChanged(com.mooc.ppjoke.BR._all);
}
}頁(yè)面布局如下:
<?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="已關(guān)注" />
</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 {
//關(guān)注/取消關(guān)注一個(gè)用戶(hù)
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);
}
});
}
}綜上已經(jīng)實(shí)現(xiàn)了簡(jiǎn)單的用戶(hù)關(guān)注功能。activity不需要做任何事情。
到此這篇關(guān)于一文教你如何使用Databinding寫(xiě)一個(gè)關(guān)注功能的文章就介紹到這了,更多相關(guān)Databinding寫(xiě)功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android應(yīng)用開(kāi)發(fā)之代碼混淆
Android項(xiàng)目中的混淆很easy,之所以寫(xiě)這篇總結(jié)是由于近期發(fā)現(xiàn)公司的代碼居然沒(méi)有混淆,反編譯后代碼隨手可得。很震驚。2014-07-07
Android 自定義gradle property詳解及實(shí)例代碼
這篇文章主要介紹了Android 自定義gradle property詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
為Retrofit統(tǒng)一添加post請(qǐng)求的默認(rèn)參數(shù)的方法
這篇文章主要介紹了為Retrofit統(tǒng)一添加post請(qǐng)求的默認(rèn)參數(shù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Android?APP瘦身shrinkResources使用問(wèn)題詳解
這篇文章主要為大家介紹了Android?APP瘦身shrinkResources使用問(wèn)題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
android studio library 模塊中正確引用aar的實(shí)例講解
下面小編就為大家分享一篇android studio library 模塊中正確引用aar的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android實(shí)現(xiàn)ListView分頁(yè)自動(dòng)加載數(shù)據(jù)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)ListView分頁(yè)自動(dòng)加載數(shù)據(jù)的方法,涉及Android生成listview列表的相關(guān)技巧,需要的朋友可以參考下2015-12-12
Android編程實(shí)現(xiàn)震動(dòng)與振鈴的方法詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)震動(dòng)與振鈴的方法,結(jié)合實(shí)例形式分析了Android實(shí)現(xiàn)震動(dòng)與振鈴的Vibrator類(lèi)及MediaPlayer類(lèi)相關(guān)使用技巧,需要的朋友可以參考下2018-03-03
Android開(kāi)發(fā)基于ScrollView實(shí)現(xiàn)的漸變導(dǎo)航欄效果示例
這篇文章主要介紹了Android開(kāi)發(fā)基于ScrollView實(shí)現(xiàn)的漸變導(dǎo)航欄效果,涉及ScrollView事件響應(yīng)及元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12

