Информация не является, когда RecyclerView с ListAdapter обновлен

Данные в RecyclerView называются первый раз без проблем. Однако, когда я освежаю данные, по какому-то разуму все элементы остаются в мишени.

Главная Активность эта

class BusinessActivity : AppCompatActivity() {

    private val businessViewModel: BusinessViewModel by viewModel()
    private val imageLoader: ImageLoader by inject()
    private lateinit var staggeredGridLayoutManager: StaggeredGridLayoutManager
    private lateinit var skeleton: Skeleton
    private val adapter: BusinessAdapter by lazy { BusinessAdapter(imageLoader, businessViewModel) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_business)
        initToolbar()
        skeleton = findViewById(R.id.skeletonLayout)
        staggeredGridLayoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
        staggeredGridLayoutManager.gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
        recycler_view.apply {
            layoutManager = staggeredGridLayoutManager
            adapter = this@BusinessActivity.adapter
            setHasFixedSize(true)
        }
        setupSkeleton()
        initializeObserverBusiness()
        refreshBusiness.setOnRefreshListener {
            refreshBusiness.isRefreshing = true
            skeleton.showSkeleton()
            businessViewModel.retrieveBusiness()
        }
    }

    private fun initToolbar() {
        setSupportActionBar(toolbar)
        supportActionBar?.title = getString(R.string.app_name)
        this.setSystemBarColor(this)
    }

    private fun setupSkeleton(){
        skeleton = recycler_view.applySkeleton(R.layout.business_card, 6)
        skeleton.showSkeleton()
    }

    private fun initializeObserverBusiness(){
        businessViewModel.uiState.observe(this, Observer {
            val dataState = it ?: return@Observer
            if (!dataState.showProgress){
                refreshBusiness.isRefreshing = false
                skeleton.showOriginal()
            }
            if (dataState.business != null && !dataState.business.consumed){
                dataState.business.consume()?.let { business ->
                    adapter.submitList(business)
                }
            }
            if (dataState.error != null && !dataState.error.consumed){
                dataState.error.consume()?.let { error ->
                    Toast.makeText(this, resources.getString(error), Toast.LENGTH_LONG).show()
                }
            }
        })
    }
}

и Адаптер для RecyclerView, в настоящее время я использую DiffCallback и ListAdapter, из-за лучшего результата.

class BusinessAdapter(var imageLoader: ImageLoader, var viewModel: BusinessViewModel) : ListAdapter(DIFF_CALLBACK){
    companion object{
        private val DIFF_CALLBACK = object : DiffUtil.ItemCallback() {
            override fun areItemsTheSame(oldItem: Business, newItem: Business) = oldItem.id == newItem.id
            override fun areContentsTheSame(oldItem: Business, newItem: Business) = oldItem == newItem
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = BusinessViewHolder.create(parent)

    override fun onBindViewHolder(holder: BusinessViewHolder, position: Int) {
        holder.bind(getItem(position), imageLoader, viewModel)
    }
}

и ViewHolder для Адаптера.

class BusinessViewHolder constructor(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer {

    fun bind(business: Business, imageLoader: ImageLoader, viewModel: BusinessViewModel) {
        businessImage?.let { imageLoader.load("${BuildConfig.MY_URL}/gallery/${business.images[0]}", it) }
        ownerBusiness.text = business.owner
        businessName.text = business.name
        cardBusiness.setOnClickListener {
            viewModel.callDetailBusiness(business.id)
        }
    }

    companion object {
        fun create(parent: ViewGroup): BusinessViewHolder {
            return BusinessViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.business_card, parent, false))
        }
    }
}

и ViewModel.

class BusinessViewModel (private val businessRepository: BusinessRepository): ViewModel() {
    private val _uiState = MutableLiveData()
    val uiState: LiveData get() = _uiState
    val _showDetailBusiness = MutableLiveData()
    val showDetailBusiness: LiveData get() = _showDetailBusiness

    init {
        retrieveBusiness()
    }

    fun retrieveBusiness(){
        viewModelScope.launch {
                runCatching {
                    emitUiState(showProgress = true)
                    businessRepository.retrieveBusiness()
                }.onSuccess {
                    emitUiState(business = Event(it))
                }.onFailure {
                    emitUiState(error = Event(R.string.internet_failure_error))
                }
        }
    }

    fun callDetailBusiness(businessId: Int) {
        _showDetailBusiness.value = businessId
    }

    private fun emitUiState(showProgress: Boolean = false, business: Event>? = null, error: Event? = null){
        val dataState = BusinessDataState(showProgress, business, error)
        _uiState.value = dataState
    }

    data class BusinessDataState(val showProgress: Boolean, val business: Event>?, val error: Event?)
}

Когда данные загружаются впервые, я это вижу. PrimarCarga

однако, когда я применяю SwipeRefresh. Я получаю данные.

D/OkHttp: [{ "пойдите":18, "ямс": "Whatsup", "owner": "Мое Одиночество", "категория": "Совсем",

но RecyclerView не присоединит новой информации.... DataPerdida

Porfavor было нужно, чтобы они помогли мне знать, как оплачивать эту ситуацию... Спасибо.

0
задан 05.11.2019, 17:42
1 ответ

Как мне удается разобраться в твоем коде, ты загружаешь layoutmanager recycler здесь

staggeredGridLayoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
    staggeredGridLayoutManager.gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
    recycler_view.apply {
        layoutManager = staggeredGridLayoutManager
        adapter = this@BusinessActivity.adapter
        setHasFixedSize(true)
    }

, Когда делается Refresh layout, и закончите загружать снова данные ты должен распределять снова layoutmanager или предпочтительно сообщать изменений adapter такого recycler

my_recycler.adapter!!.notifyDataSetChanged()

Помнит, что ты должен делать это после, что обновили данные о списке, который ты хочешь показать в этом recycler

0
ответ дан 01.12.2019, 12:40