RecyclerView 仅在重新启动 Activity 后显示数据

时间:2021-06-17 20:40:25

标签: android kotlin android-fragments android-recyclerview android-diffutils

所以我有一个奇怪的行为,我的 RecyclerView 只在我启动应用程序时显示数据,然后通过 Android Studio 重新启动活动。或者在 XML 中进行更改,然后撤消它并重新启动。 然后显示的数据是正确的,当我添加东西时也会更新,但在启动应用程序后它不可见。

谁能帮帮我?我真的不知道为什么会这样。

片段:

@AndroidEntryPoint
class HistoryFragment : Fragment(R.layout.fragment_history) {

    private val viewModel: PurchaseViewmodel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val binding = FragmentHistoryBinding.bind(view)

        val exampleAdapter = ExampleAdapter()

        binding.apply{
            recyclerView.apply{

                layoutManager = LinearLayoutManager(requireContext())
                adapter = exampleAdapter
                setHasFixedSize(true)
            }
            ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
                override fun onMove(
                    recyclerView: RecyclerView,
                    viewHolder: RecyclerView.ViewHolder,
                    target: RecyclerView.ViewHolder
                ): Boolean {
                    return false /// We dont need any interaction with Drag&Drop we only want swipe left&right
                }

                override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                    val receipt = exampleAdapter.currentList[viewHolder.adapterPosition]
                     viewModel.onSwipe(receipt)
                }
            }).attachToRecyclerView(recyclerView)
        }

        setFragmentResultListener("add_receipt_request"){_,bundle ->
            val result = bundle.getInt("add_receipt_request")
            viewModel.onAddResult(result)
        }

        viewModel.receipts.observe(viewLifecycleOwner){ /// New Items get passed to the List
            exampleAdapter.submitList(it)
        }
        viewLifecycleOwner.lifecycleScope.launchWhenStarted { //as soon as we close our app the events will be suspended, but not deleted and will remain after restart
            viewModel.addTaskEvent.collect {  event->
                when(event){
                    is PurchaseViewmodel.TasksEvent.ShowUndoDelete -> {
                        Snackbar.make(requireView(),"Tasks deleted", Snackbar.LENGTH_LONG)
                            .setAction("UNDO"){
                                viewModel.unDoDeleteClick(event.receipts)
                            }.show()
                    }
                }
            }
        }

    }
}

适配器:

class ExampleAdapter : ListAdapter<Receipts,ExampleAdapter.ExampleViewHolder>(DiffCallback()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder { 
        val binding = ReceiptsBinding.inflate(LayoutInflater.from(parent.context),parent,false)
        return ExampleViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ExampleViewHolder, position: Int) {
        val currentItem = getItem(position)
        holder.bind(currentItem)
    }

    override fun getItemCount(): Int {
        return super.getItemCount()
    }

    class ExampleViewHolder(private val binding: ReceiptsBinding) : RecyclerView.ViewHolder(binding.root){ //Examples One Row in our list
        fun bind (receipts: Receipts) {
            binding.apply {
                storeHistory.text = receipts.store
                amountHistory.text = receipts.total
                dateHistory.text  = receipts.date
            }
        }
    }


    class DiffCallback : DiffUtil.ItemCallback<Receipts>() {
        override fun areItemsTheSame(oldItem: Receipts, newItem: Receipts) =
            oldItem.id == newItem.id


        override fun areContentsTheSame(oldItem: Receipts, newItem: Receipts) =
            oldItem == newItem
    }
}

1 个答案:

答案 0 :(得分:0)

您应该比较 Receipts 中旧/新 areContentsTheSame() 的对应字段,而不是比较整个旧/新对象

override fun areContentsTheSame(oldItem: Receipts, newItem: Receipts) = 
    oldItem.store == newItem.store 
            && oldItem.total == newItem.total 
            && oldItem.date == newItem.date
相关问题