Articles of android architecture components

Android Paging库不会触发loadAfter()

我正在使用新的Android Paging库来获得具有无限滚动function的RecyclerView。 我无法理解为什么当我像这样设置我的PagedList时,库不会触发loadAfter()方法: val config: PagedList.Config = PagedList.Config.Builder() .setEnablePlaceholders(false) .setPageSize(10) .setPrefetchDistance(1) .setInitialLoadSizeHint(10) .build() val pageList = PagedList.Builder(LookDataSource(lookList), config) .setInitialKey(0) .setMainThreadExecutor(MainThreadExecutor()) .setBackgroundThreadExecutor(PaginationThreadPoolExecutor()) .setBoundaryCallback(LookBoundaryCallback()) .build() 注意:我的prefetchDistance是1,因为我想在看到最后一个项目时加载另一批数据。 文档说0将永远不会加载更多数据 我的DataSource是一个PageKeyedDataSource ,键是页面的索引。 我查看了ContiguousPagedList的源代码,它是使用PageKeyedDataSource时创建的特定PagedList,我无法理解: @MainThread @Override protected void loadAroundInternal(int index) { int prependItems = mConfig.prefetchDistance – (index – mStorage.getLeadingNullCount()); int appendItems = index + mConfig.prefetchDistance – (mStorage.getLeadingNullCount() + mStorage.getStorageCount()); mPrependItemsRequested = […]

如何在Navigation Controller中使用共享元素转换

我想在导航到其他片段时使用导航架构组件添加共享元素转换。 但我不知道怎么做。 在文件中也没有任何关于它。 有人能帮我吗?

由于缺少方法而导致发布前报告失败(在com.google.android.apps.mtaas.crawler-1 / base.apk中)

从最近我的应用程序开始在预启动报告中包含奇怪的错误消息(上传到Play商店后自动生成)。 这些报告包含以下exception: Exception java.lang.NoSuchMethodError: No interface method a(Landroid/arch/lifecycle/e;Landroid/arch/lifecycle/b$a;)V in class Landroid/arch/lifecycle/GenericLifecycleObserver; or its super classes (declaration of ‘android.arch.lifecycle.GenericLifecycleObserver’ appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk) android.arch.lifecycle.f$aa (f.java:326) android.arch.lifecycle.fa (f.java:159) com.firebase.ui.database.FirebaseRecyclerAdapter. (FirebaseRecyclerAdapter.java:40) 和: Exception java.lang.NoSuchMethodError: No static method a(Landroid/app/Activity;)V in class Landroid/arch/lifecycle/ReportFragment; or its super classes (declaration of ‘android.arch.lifecycle.ReportFragment’ appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk) android.arch.lifecycle.LifecycleDispatcher$DispatcherActivityCallback.onActivityCreated (LifecycleDispatcher.java:77) android.app.Application.dispatchActivityCreated (Application.java:219) android.app.Activity.onCreate (Activity.java:1040) android.support.v4.app.SupportActivity.onCreate (SupportActivity.java:66) […]

为什么要为新连接的观察者触发两次LiveData观察者

我对LiveData理解是,它会触发观察者对数据的当前状态变化,而不是一系列历史状态变化的数据。 目前,我有一个MainFragment ,它执行Room写操作,将非删除数据更改为trashed数据 。 我还有另一个TrashFragment ,它观察到了数据的破坏 。 请考虑以下情形。 目前有0个已删除的数据 。 MainFragment是当前活动的片段。 尚未创建TrashFragment 。 MainFragment添加了1个已删除的数据 。 现在,有1个已删除的数据 我们使用导航抽屉,用TrashFragment替换TrashFragment 。 TrashFragment的观察者将首先收到onChanged ,其中包含0个已删除的数据 同样, TrashFragment的观察者将获得onChanged ,其中包含1个已删除的数据 我的期望是,第(6)项不应该发生。 TrashFragment应该只接收最新的已删除数据 ,即1。 这是我的代码 TrashFragment.java public class TrashFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { noteViewModel = ViewModelProviders.of(getActivity()).get(NoteViewModel.class); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { … […]

带有MVP的Android架构组件

谷歌IO 17上发布了新的Android架构组件。 那么我们应该将MVP与架构组件和MVVM一起使用吗? 在Github上的谷歌样本中,他们使用了MVVM模型。 Google Sample

从ViewModel观察LiveData

我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。 现在我想将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从我的数据获取类返回的LiveData对象。 observe方法需要一个LifecycleOwner对象作为第一个参数,但我显然没有在我的ViewModel内部,我知道我不应该保持对ViewModel内部的Activity / Fragment的引用。 我该怎么办?

具有Android Room的可重用通用基类DAO

有没有办法用Android Room创建可重用的通用基类DAO? public interface BaseDao { @Insert void insert(T object); @Update void update(T object); @Query(“SELECT * FROM #{T} WHERE id = :id”) void findAll(int id); @Delete void delete(T object); } public interface FooDao extends BaseDao { … } public interface BarDao extends BaseDao { … } 我无法find实现这一目标的任何方法,而无需声明相同的接口成员并为每个子类编写查询。 在处理大量类似的DAO时,这变得非常乏味……

将LiveData与数据绑定结合使用

随着Android体系结构组件的稳定,我开始将所有基本的ViewModel更新为ViewModel的新实现。 根据我的理解,建议使用LiveData来保存Model类,因为它可以更好地处理生命周期。 我喜欢使用Data Binding因为它使代码在Java / Kotlin方面更加清晰,并且不需要“观察”值更改来更新UI。 但是,如果Model (或ViewModel)扩展BaseObservable而LiveData不扩展,则使用Data Binding的布局仅监视数据更改。 我理解LiveData的主要目标之一LiveData编程方式观察和更新UI,但对于简单的更新, Data Binding非常有用。 这个问题已经报道过( GitHub和Stack Overflow ),并且首先说版本1.0会有它,现在据说这个function正在开发中。 为了同时使用LiveData和Data Binding ,我创建了一个非常简单的类实现,它扩展了BaseObservable : import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData import android.databinding.BaseObservable class ObservableMutableLiveData() : BaseObservable() { private var data: MutableLiveData = MutableLiveData() constructor(data: T) : this() { this.data.value = data } public fun set(value: T) { if (value != data.value) […]

了解Android架构组件示例GithubBrowserSample:ViewModelModule,ViewModel参数

涵盖Android架构组件的最新样本之一是Google提供的GithubBrowserSample 。 我查看了代码并出现了一些问题: 我注意到ViewModelModule包含在AppModule中 。 这意味着所有视图模型都被添加到DI图中。 为什么以这种方式完成,而不是为每个Activity / Fragment提供单独的Module ,只为特定的Activity / Fragment提供所需的ViewModel ? 在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将parameter passing给特定的ViewModel ? 或者更好的解决方案是在ViewModel创建一个setter并通过setter设置所需的param?

无法在AppCompatActivity上解析符号ViewModelProviders

嘿我想让我的ViewModel工作,但到目前为止没有运气。 Android Studio显示错误Cannot resolve symbol ‘ViewModelProviders’ 。 我在这个主题上发现的每一个问题都是纠正extends Activity以extends AppCompatActivity ,但我正在扩展正确的问题。 不确定我错过了什么…… 我的代码基于此YouTubevideo MainActivity.java public class MainActivity extends AppCompatActivity implements TileAdapter.TileAdapterOnClickHandler { private BaseViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //set Toolbar Toolbar myToolbar = findViewById(R.id.toolbar); setSupportActionBar(myToolbar); //initialize viewModel viewModel = ViewModelProviders.of(this).get(BaseViewModel.class); BaseViewModel.java public class BaseViewModel extends ViewModel { private Movie[] mMovie; […]