RecyclerView 列表的无限更新

Infinite updating of the RecyclerView list

在 dagger 和 rx 的帮助下Java 我更新了 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)
    }
}

我的视图模型:

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) {
                }
            })
        )
    }
}

还有我的Activity:

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()

        })

好的,如果您只想更新一次数据列表...我建议您查看一个会触发重新加载回收站视图的实时事件 因此

//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 数据,一旦从改造中获取它就会更新(考虑 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();
}

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

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

希望对您有所帮助。

这是一个逻辑错误。您需要如下所示重写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
    }

}