From 70fd325c00e3d18cfdb27a83b7d5e90516f5b6e1 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Wed, 22 Oct 2025 11:36:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=9B=AE=E5=BD=95=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=8B=96=E5=8A=A8=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E5=B9=B6=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contact/add/ContactAddActivity.java | 4 +- .../contact/add/ContactAddViewModel.java | 52 ++++++++-- .../contact/list/ContactListActivity.java | 23 +++-- .../contact/list/ContactListViewModel.java | 95 ++++++++++++++++--- .../dialer/adapter/ContactInfoAdapter.java | 5 +- .../dialer/{ => db}/contact/AppDatabase.java | 9 +- .../dialer/{ => db}/contact/Contact.java | 25 +++-- .../dialer/{ => db}/contact/ContactDao.java | 12 ++- .../{ => db}/contact/ContactRepository.java | 13 ++- .../{ => db}/contact/ContactViewModel.java | 4 +- .../dialer/view/ItemTouchHelperCallback.java | 6 +- 11 files changed, 199 insertions(+), 49 deletions(-) rename app/src/main/java/com/ttstd/dialer/{ => db}/contact/AppDatabase.java (81%) rename app/src/main/java/com/ttstd/dialer/{ => db}/contact/Contact.java (77%) rename app/src/main/java/com/ttstd/dialer/{ => db}/contact/ContactDao.java (70%) rename app/src/main/java/com/ttstd/dialer/{ => db}/contact/ContactRepository.java (86%) rename app/src/main/java/com/ttstd/dialer/{ => db}/contact/ContactViewModel.java (96%) diff --git a/app/src/main/java/com/ttstd/dialer/activity/contact/add/ContactAddActivity.java b/app/src/main/java/com/ttstd/dialer/activity/contact/add/ContactAddActivity.java index dc0c9c7..7b12bd5 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/contact/add/ContactAddActivity.java +++ b/app/src/main/java/com/ttstd/dialer/activity/contact/add/ContactAddActivity.java @@ -7,7 +7,6 @@ import androidx.lifecycle.Observer; import com.ttstd.dialer.R; import com.ttstd.dialer.base.mvvm.BaseMvvmActivity; -import com.ttstd.dialer.contact.Contact; import com.ttstd.dialer.databinding.ActivityContactAddBinding; import com.ttstd.dialer.filter.NoSpaceInputFilter; @@ -58,8 +57,7 @@ public class ContactAddActivity extends BaseMvvmActivity { private static final String TAG = "ContactAddViewModel"; @@ -25,9 +33,41 @@ public class ContactAddViewModel extends BaseViewModel mIntegerMutableLiveData = new MutableLiveData<>(); - public void insert(Contact contact) { - Log.e(TAG, "insert: " ); - mIntegerMutableLiveData.setValue(mRepository.insert(contact)); + public void saveContact(String name, String phone) { + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + int count = mRepository.getTotalCount() + 1; + Contact contact = new Contact(name, phone, count); + Log.e(TAG, "saveContact: " + contact); + emitter.onNext(mRepository.insert(contact)); + emitter.onComplete(); + } + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("saveContact", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull Long aLong) { + Log.e("saveContact", "onNext: " + aLong); + mIntegerMutableLiveData.setValue(aLong); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("saveContact", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("saveContact", "onComplete: "); + } + }); } } diff --git a/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListActivity.java b/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListActivity.java index 4062c49..22670cd 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListActivity.java +++ b/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListActivity.java @@ -7,14 +7,13 @@ import android.view.View; import androidx.lifecycle.Observer; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import com.ttstd.dialer.R; import com.ttstd.dialer.activity.contact.add.ContactAddActivity; import com.ttstd.dialer.adapter.ContactInfoAdapter; import com.ttstd.dialer.base.mvvm.BaseMvvmActivity; -import com.ttstd.dialer.contact.Contact; import com.ttstd.dialer.databinding.ActivityContactListBinding; +import com.ttstd.dialer.db.contact.Contact; import com.ttstd.dialer.view.ItemTouchHelperCallback; import java.util.List; @@ -25,6 +24,8 @@ public class ContactListActivity extends BaseMvvmActivity mContacts; + @Override public boolean setNightMode() { return true; @@ -54,12 +55,21 @@ public class ContactListActivity extends BaseMvvmActivity>() { @Override public void onChanged(List contacts) { - Log.e(TAG, "onChanged: " + contacts); - mContactInfoAdapter.setContacts(contacts); + Log.e(TAG, "mContactListData: " + contacts); + mContacts = contacts; + mContactInfoAdapter.setContacts(mContacts); } }); } diff --git a/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListViewModel.java b/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListViewModel.java index 52c20ed..f821973 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListViewModel.java +++ b/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListViewModel.java @@ -1,18 +1,27 @@ package com.ttstd.dialer.activity.contact.list; import android.content.Context; +import android.util.Log; import androidx.lifecycle.MutableLiveData; +import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.ttstd.dialer.base.mvvm.BaseViewModel; -import com.ttstd.dialer.contact.Contact; -import com.ttstd.dialer.contact.ContactRepository; import com.ttstd.dialer.databinding.ActivityContactListBinding; +import com.ttstd.dialer.db.contact.Contact; +import com.ttstd.dialer.db.contact.ContactRepository; -import java.util.Comparator; import java.util.List; -import java.util.stream.Collectors; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.ObservableEmitter; +import io.reactivex.rxjava3.core.ObservableOnSubscribe; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.schedulers.Schedulers; public class ContactListViewModel extends BaseViewModel { private static final String TAG = "ContactListViewModel"; @@ -27,19 +36,81 @@ public class ContactListViewModel extends BaseViewModel> mContactListData = new MutableLiveData<>(); public void getAllContacts() { - List contacts = mRepository.getAllContacts(); - List sorted = contacts.stream().sorted(new Comparator() { + Observable.create(new ObservableOnSubscribe>() { @Override - public int compare(Contact o1, Contact o2) { - return Integer.compare(o1.getSort(), o2.getSort()); + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + List contacts = mRepository.getAllContacts(); + emitter.onNext(contacts); + emitter.onComplete(); } - }).collect(Collectors.toList()); + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAllContacts", "onSubscribe: "); + } - mContactListData.setValue(sorted); + @Override + public void onNext(@NonNull List contacts) { + Log.e("getAllContacts", "onNext: "); + mContactListData.setValue(contacts); + +// List sorted = contacts.stream().sorted(new Comparator() { +// @Override +// public int compare(Contact o1, Contact o2) { +// return Integer.compare(o1.getSort(), o2.getSort()); +// } +// }).collect(Collectors.toList()); +// mContactListData.setValue(sorted); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAllContacts", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getAllContacts", "onComplete: "); + } + }); } - public List searchContacts(String query) { - return mRepository.searchContacts(query); + public void updateItemPosition(Contact contact) { + Log.e(TAG, "updateItemPosition: " + contact); + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + int id = mRepository.update(contact); + emitter.onNext(id); + emitter.onComplete(); + } + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("updateItemPosition", "onComplete: "); + } + + @Override + public void onNext(@NonNull Integer integer) { + Log.e("updateItemPosition", "onNext: " + integer); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("updateItemPosition", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("updateItemPosition", "onComplete: "); + } + }); } } diff --git a/app/src/main/java/com/ttstd/dialer/adapter/ContactInfoAdapter.java b/app/src/main/java/com/ttstd/dialer/adapter/ContactInfoAdapter.java index b3d63e4..92900f7 100644 --- a/app/src/main/java/com/ttstd/dialer/adapter/ContactInfoAdapter.java +++ b/app/src/main/java/com/ttstd/dialer/adapter/ContactInfoAdapter.java @@ -12,7 +12,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.shehuan.niv.NiceImageView; import com.ttstd.dialer.R; -import com.ttstd.dialer.contact.Contact; +import com.ttstd.dialer.db.contact.Contact; import java.util.Collections; import java.util.List; @@ -81,6 +81,9 @@ public class ContactInfoAdapter extends RecyclerView.Adapter getAllContacts(); @Query("SELECT * FROM contacts WHERE id = :id") diff --git a/app/src/main/java/com/ttstd/dialer/contact/ContactRepository.java b/app/src/main/java/com/ttstd/dialer/db/contact/ContactRepository.java similarity index 86% rename from app/src/main/java/com/ttstd/dialer/contact/ContactRepository.java rename to app/src/main/java/com/ttstd/dialer/db/contact/ContactRepository.java index 737e8d4..6bade65 100644 --- a/app/src/main/java/com/ttstd/dialer/contact/ContactRepository.java +++ b/app/src/main/java/com/ttstd/dialer/db/contact/ContactRepository.java @@ -1,17 +1,24 @@ -package com.ttstd.dialer.contact; +package com.ttstd.dialer.db.contact; import android.content.Context; + import java.util.List; public class ContactRepository { private ContactDao mContactDao; - private List mAllContacts; // 构造函数,获取数据库访问对象 public ContactRepository(Context context) { AppDatabase db = AppDatabase.getDatabase(context); mContactDao = db.contactDao(); - mAllContacts = mContactDao.getAllContacts(); + } + + public int getTotalCount() { + return mContactDao.getTotalCount(); + } + + public int getCountById() { + return mContactDao.getCountById(); } // 获取所有联系人 diff --git a/app/src/main/java/com/ttstd/dialer/contact/ContactViewModel.java b/app/src/main/java/com/ttstd/dialer/db/contact/ContactViewModel.java similarity index 96% rename from app/src/main/java/com/ttstd/dialer/contact/ContactViewModel.java rename to app/src/main/java/com/ttstd/dialer/db/contact/ContactViewModel.java index fd066e5..62f0def 100644 --- a/app/src/main/java/com/ttstd/dialer/contact/ContactViewModel.java +++ b/app/src/main/java/com/ttstd/dialer/db/contact/ContactViewModel.java @@ -1,7 +1,9 @@ -package com.ttstd.dialer.contact; +package com.ttstd.dialer.db.contact; import android.app.Application; + import androidx.lifecycle.AndroidViewModel; + import java.util.List; public class ContactViewModel extends AndroidViewModel { diff --git a/app/src/main/java/com/ttstd/dialer/view/ItemTouchHelperCallback.java b/app/src/main/java/com/ttstd/dialer/view/ItemTouchHelperCallback.java index d3433a6..b9bfb47 100644 --- a/app/src/main/java/com/ttstd/dialer/view/ItemTouchHelperCallback.java +++ b/app/src/main/java/com/ttstd/dialer/view/ItemTouchHelperCallback.java @@ -29,7 +29,7 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { // 通知适配器项已移动 - mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); + mAdapter.onItemMove(viewHolder.getBindingAdapterPosition(), target.getBindingAdapterPosition()); return true; } @@ -37,7 +37,7 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // 通知适配器项已删除 - mAdapter.onItemDismiss(viewHolder.getAdapterPosition()); + mAdapter.onItemDismiss(viewHolder.getBindingAdapterPosition()); } // 当长按item时启用拖动 @@ -49,6 +49,6 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { // 启用滑动删除 @Override public boolean isItemViewSwipeEnabled() { - return true; + return false; } }