RecyclerView列表的无限更新

问题描述 投票:0回答:2

借助dagger和rxJava,我在RecyclerView中更新了列表。一切正常,显示列表。但是问题是,在日志中,我看到了此列表的每秒更新方式。可能是什么问题呢?在类似的项目中,但在Java中,一切正常运行,列表在启动时更新一次。我的网络模块:

@Module(includes = [ViewModelModule::class])
class NetworkModule {

    companion object {
        const val KEY = "key"
        const val BASE_URL = "base_url"
    }

    @Provides
    @Singleton
    fun provideOkHttp(): OkHttpClient {
        val httpClient = OkHttpClient.Builder()
        httpClient.addInterceptor(object : Interceptor {
            @Throws(IOException::class)
            override fun intercept(chain: Interceptor.Chain): okhttp3.Response {
                val original = chain.request()
                val originalHttpUrl = original.url
                val url = originalHttpUrl.newBuilder()
                    //.addQueryParameter("apikey", KEY)
                    .build()
                val requestBuilder = original.newBuilder()
                    .url(url)
                    .header("apikey", KEY)
                val request = requestBuilder.build()
                return chain.proceed(request)
            }
        })
        // logging interceptor
        val logging = HttpLoggingInterceptor()
        logging.level = HttpLoggingInterceptor.Level.BODY
        httpClient.addInterceptor(logging)
        return httpClient.build()
    }

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {

        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(provideOkHttp())
            .build()
    }

    @Provides
    @Singleton
    fun provideContactsService(retrofit: Retrofit) : ContactsService{

        return retrofit.create(ContactsService::class.java)
    }
}

我的ViewModel:

class ContactsViewModel @Inject constructor(private val contactsRepository: ContactsRepository) :
    ViewModel() {

    var mutableLiveData = MutableLiveData<List<ContactsModel>>()
    private val disposable = CompositeDisposable()

    fun getContactMutableLiveData(): MutableLiveData<List<ContactsModel>> {
        loadData()
        return mutableLiveData
    }

    fun loadData() {

       disposable.add(contactsRepository.modelSingle()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : DisposableSingleObserver<List<ContactsModel>>() {
                override fun onSuccess(t: List<ContactsModel>) {
                getContactMutableLiveData().value = t
                }

                override fun onError(e: Throwable) {
                }
            })
        )
    }
}

和我的活动:

contactsViewModel.getContactMutableLiveData().observe(this@ContactListActivity, Observer {

            mAdapter = ContactsAdapter(this@ContactListActivity, it as ArrayList<ContactsModel>)
            recycler_contacts.layoutManager =
                LinearLayoutManager(applicationContext, OrientationHelper.VERTICAL, false)
            recycler_contacts.adapter = mAdapter
            recycler_contacts.setHasFixedSize(true)

            mAdapter.sortByName()

        })
android android-recyclerview rx-java2 android-mvvm
2个回答
0
投票

[如果您只想只更新一次数据列表,...我建议您查看一个直播事件,该事件将触发重新加载回收站视图因此

//in repo
private SingleLiveEvent<Boolean> listHasBeenUpdate=new SingleLiveEvent<>();
//setItsGetterInTheRepo
public SingleLiveEvent<Boolean> getListHasBeenUpdated(){
return listHasBeenUpdated();
}
//uponSucessfuly fetching your list from retrofit
listHasBeenUpdated=true;
//pass list to viewmodel

然后在ViewModel中,我将列表设置为一个Observable Data,一旦从改造中获取数据,该数据将被更新(考虑using room db以存储此数据]

//use a setter to set the list from Repo
ObservableField<List<Contacts>> list=new ObservableField<>();

public SingleLiveEvent<List<Contacts>> fetchContacts(){
   return myRepo.getListHasBeenUpdated();
}

现在在您的活动课程中,像这样观察单个现场活动

viewModel.fetchContacts().observe(this,contacts->{
  if(contacts){
    //update Recycler
  }
});

希望对您有帮助。


0
投票

这是一个逻辑错误。您需要如下所示重写loadData函数

class ContactsViewModel @Inject constructor(private val contactsRepository: ContactsRepository) :
    ViewModel() {

    var mutableLiveData = MutableLiveData<List<ContactsModel>>()
    private val disposable = CompositeDisposable()

    fun getContactMutableLiveData(): MutableLiveData<List<ContactsModel>> {

        disposable.add(contactsRepository.modelSingle()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : DisposableSingleObserver<List<ContactsModel>>() {
                override fun onSuccess(t: List<ContactsModel>) {
                    mutableLiveData.value = t
                }
                override fun onError(e: Throwable) {
                }
            }))
        return mutableLiveData
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.