标签: android-architecture-components

Android Paging 3 - 滚动和加载新页面时出现闪烁、故障或位置跳跃

大家好,我使用 Android Jetpack Paging 库 3,我正在创建一个实现网络 + 数据库场景的新闻应用程序,我正在关注 google 的 Codelab https://codelabs.developers.google.com/codelabs/android-paging,我几乎就像在 Codelab 中一样,我几乎匹配了示例中显示的所有操作https://github.com/android/architecture-components-samples/tree/main/PagingWithNetworkSample

它几乎按其应有的方式工作......但我的后端响应是页面键控的,我的意思是响应带有新闻列表和下一页网址,远程中介获取数据,填充数据库,设置存储库,设置视图模型。 ..

问题是:当recyclerview加载数据时,会发生以下情况:recyclerview闪烁、项目跳转、被删除、再次添加等等。我不知道为什么 recyclerview 或其 itemanimator 的行为如此,看起来如此丑陋和故障。更重要的是,当我滚动到列表末尾时,会获取新项目,并且再次发生故障和跳跃效果。

如果您能帮助我,我将非常感激,我已经坐了三天了,提前非常感谢您。这是我的代码片段:

@Entity(tableName = "blogs")
data class Blog(
@PrimaryKey(autoGenerate = true)
val databaseid:Int,

@field:SerializedName("id")
val id: Int,
@field:SerializedName("title")
val title: String,

@field:SerializedName("image")
val image: String,

@field:SerializedName("date")
val date: String,

@field:SerializedName("share_link")
val shareLink: String,

@field:SerializedName("status")

val status: Int,

@field:SerializedName("url")
val url: String
) {
var categoryId: Int? = null
var tagId: Int? = null
 }
Run Code Online (Sandbox Code Playgroud)

这是 DAO

@Insert(onConflict …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components android-paging android-paging-library android-paging-3

23
推荐指数
1
解决办法
9172
查看次数

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

有没有办法用Android Room创建可重用的通用基类DAO?

public interface BaseDao<T> {

  @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<FooObject> { ... }

public interface BarDao extends BaseDao<BarEntity> { ... }
Run Code Online (Sandbox Code Playgroud)

我无法找到任何方法来实现这一点,而无需声明相同的接口成员并为每个子类编写查询.在处理大量类似的DAO时,这变得非常乏味......

android android-room android-architecture-components

22
推荐指数
4
解决办法
6933
查看次数

将LiveData与数据绑定结合使用

随着Android体系结构组件的稳定,我开始将所有基本ViewModel的更新到新的实现ViewModel.根据我的理解,LiveData建议使用它来保存Model类,因为它更好地处理生命周期.

我喜欢使用Data Binding它,因为它使代码在Java/Kotlin方面更清晰,并且不需要"观察"值更改来更新UI.但是,Data Binding如果Model(或ViewModel)扩展BaseObservable,LiveData则仅使用监视数据的布局会发生变化.我理解的主要目标之一LiveData是以编程方式观察和更新UI,但对于简单的更新,Data Binding非常有用.

这个问题已经报道过(GitHubStack Overflow),并且首先说版本1.0会有它,现在据说这个功能正在开发中.

为了同时使用LiveDataData Binding,我创建了一个非常简单的类实现,它扩展了BaseObservable:

import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.databinding.BaseObservable

class ObservableMutableLiveData<T>() : BaseObservable() {

    private var data: MutableLiveData<T> = MutableLiveData()

    constructor(data: T) : this() {
        this.data.value = data
    }

    public fun set(value: T) {
        if (value != data.value) {
            data.value = value …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-databinding android-mvvm android-architecture-components

22
推荐指数
2
解决办法
1万
查看次数

如何转换 PagedList 中的项目?(Android Arch 组件分页库)

Android Architecture Component 现在引入了Paging Library,这很棒。

根据官方的 demoDataSource.Factory现在支持mapmapByPage方法,这意味着我们可以将项目转换为一个DataSource

但是DataSource并且DataSource.Factory应该在模型层,而不是Presenter/View 层。然而,很多时候我们想要在我们的 Adapter(对于 RecyclerView 或 ListView)中转换数据,很明显,这是 Presentor/View 层逻辑。现在,一个 Adapter 持有一个 的实例PagedList,但PageList不能支持这些操作,这有点尴尬。此外,有时我们还想向PagedList.

所以这是一个功能请求:

  1. 支持项目转换 PagedList

  2. 支持项目添加/删除到/从 PagedList

欢迎任何讨论。

paging android android-architecture-components android-paging

22
推荐指数
1
解决办法
3860
查看次数

导航体系结构组件 - "新建资源"对话框没有导航图的导航资源类型

即使在添加导航架构组件依赖项后,"新建资源"对话框也没有导航图的导航资源类型

def nav_version = '1.0.0-alpha01'
implementation "android.arch.navigation:navigation-fragment:$nav_version"
implementation "android.arch.navigation:navigation-ui:$nav_version"
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

navigation android googleio android-architecture-components android-architecture-navigation

22
推荐指数
3
解决办法
4688
查看次数

如何在RecyclerView Adapter中使用Architecture Components ViewModel?

我有多个ViewHolders,它们在垂直RecyclerView中作为独立视图工作.我正在练习新的Architecture Components ViewModel.

在我的ViewModel中,我有一些我想要观察的MutableLiveData列表.但我怎么称呼

ViewModelProviders.of((AppCompatActivity)getActivity()).get(FilterViewModel.class)
Run Code Online (Sandbox Code Playgroud)

mFilterViewModel.getCountries().observe(this, new Observer<ArrayList<TagModel>>() {
            @Override
            public void onChanged(@Nullable ArrayList<TagModel> tagModels) {

            }
        });
Run Code Online (Sandbox Code Playgroud)

不泄漏活动或将活动保存在适配器内.

我的ViewModel

public class FilterViewModel extends ViewModel {

private final MutableLiveData<ArrayList<TagModel>> mCountries;
private final MutableLiveData<ArrayList<TagModel>> mSelectedCountryProvinceList;
private final MutableLiveData<ArrayList<TagModel>> mDistanceList;

public FilterViewModel(){

    mCountries = new MutableLiveData<>();
    mSelectedCountryProvinceList = new MutableLiveData<>();
    mDistanceList = new MutableLiveData<>();

    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() {
        @Override
        public void update(TagSearchList object) {
            mCountries.setValue(object.getCountries());
        }

        @Override
        public void update(int id, TagSearchList object) {
            if (id == 5){
                TagStore.getInstance().unSubcribe(this);
                update(object);
            }
        } …
Run Code Online (Sandbox Code Playgroud)

java android android-architecture-components

21
推荐指数
2
解决办法
9393
查看次数

具有多个参数的MediatorLiveData或switchMap转换

Transformations.switchMap在我的ViewModel中使用,因此LiveData在我的片段中观察到的我的集合会对code参数的变化做出反应.

这非常有效:

public class MyViewModel extends AndroidViewModel {

    private final LiveData<DayPrices> dayPrices;
    private final MutableLiveData<String> code = new MutableLiveData<>();
    // private final MutableLiveData<Integer> nbDays = new MutableLiveData<>();
    private final DBManager dbManager;

    public MyViewModel(Application application) {
        super(application);
        dbManager = new DBManager(application.getApplicationContext());
        dayPrices = Transformations.switchMap(
            code,
            value -> dbManager.getDayPriceData(value/*, nbDays*/)
        );
    }

    public LiveData<DayPrices> getDayPrices() {
        return dayPrices;
    }

    public void setCode(String code) {
        this.code.setValue(code);
    }

    /*public void setNbDays(int nbDays) {
        this.nbDays.setValue(nbDays);
    }*/

}

public class …
Run Code Online (Sandbox Code Playgroud)

android observer-pattern android-livedata android-viewmodel android-architecture-components

21
推荐指数
3
解决办法
9882
查看次数

将房间数据库中的唯一约束添加到多列

我在房间里有一个实体

@Entity(foreignKeys ={
        @ForeignKey(entity = Label.class, parentColumns = "_id", childColumns = "labelId", onDelete = CASCADE),
        @ForeignKey(entity = Task.class, parentColumns = "_id", childColumns = "taskId", onDelete = CASCADE)
})
public class LabelOfTask extends Data{
    @ColumnInfo(name = "labelId")
    private Integer labelId;
    @ColumnInfo(name = "taskId")
    private Integer taskId;
}
Run Code Online (Sandbox Code Playgroud)

这个实体的sql语法如下

CREATE TABLE `LabelOfTask` (
    `_id` INTEGER PRIMARY KEY AUTOINCREMENT,
     `labelId` INTEGER,
     `taskId` INTEGER,
     FOREIGN KEY(`labelId`) REFERENCES `Label`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE ,
     FOREIGN KEY(`taskId`) REFERENCES `Task`(`_id`) ON UPDATE NO ACTION …
Run Code Online (Sandbox Code Playgroud)

sqlite android database-design android-room android-architecture-components

19
推荐指数
3
解决办法
1万
查看次数

Kotlin中的ViewModel:未解决的参考

我试图在100%Kotlin应用程序中实现ViewModel.我能找到的每一篇文档都说我想用它来获取ViewModel实例:

ViewModelProviders.of(this).get(CustomViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

根据文档,我应该能够导入:

import android.arch.lifecycle.ViewModelProviders
Run Code Online (Sandbox Code Playgroud)

但是这个导入尚未解决.我在我的构建文件中使用以下内容:

def androidArchVersion = '1.1.1'
implementation "android.arch.lifecycle:viewmodel:$androidArchVersion"
implementation "android.arch.lifecycle:livedata:$androidArchVersion"
annotationProcessor "android.arch.lifecycler:compiler:$androidArchVersion"
testImplementation "android.arch.core:core-testing:$androidArchVersion"
Run Code Online (Sandbox Code Playgroud)

为什么我不能访问ViewModelProviders

android viewmodel gradle kotlin android-architecture-components

19
推荐指数
3
解决办法
7211
查看次数

Android架构组件:依赖版本的Gradle同步错误

我正在尝试将ViewModel和LiveData添加到Kotlin应用程序中.我将以下依赖项添加到我的模块中build.gradle:

implementation "android.arch.lifecycle:extensions:1.1.1"
kapt "android.arch.lifecycle:compiler:1.1.1"
testImplementation "android.arch.core:core-testing:1.1.1"
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Android依赖项'android.arch.lifecycle:runtime'具有不同版本的编译(1.0.0)和运行时(1.1.1)类路径.您应该通过DependencyResolution手动设置相同的版本

删除第一行(extensions)修复了问题,表明错误来自那里,但我无法弄清楚原因.

android gradle kotlin android-architecture-components

19
推荐指数
3
解决办法
2万
查看次数