【问题标题】:how to remove previous result list immediately when updating recycler view?更新回收站视图时如何立即删除以前的结果列表?
【发布时间】:2019-06-24 00:58:59
【问题描述】:

这是我的问题的简短视频: https://drive.google.com/file/d/108Tk9rmJtF3Ir7Nj9hheW2JkvlqXggcj/view

所以,我有一个垂直回收器视图,可以在点击选项卡布局时刷新。

如果我点击选项卡的第一个索引,它将从服务器获取一些数据并填充适配器和回收器视图。但是如果我点击第二个索引,来自服务器的数据实际上是空的。

问题来了……

您可以从上面的短视频中看到。当我点击第二个选项卡(之前在第一个选项卡中)时,它仍然显示第一个选项卡中的列表出现一秒钟,然后最终显示一个空的回收站视图。

我想在从服务器加载数据后,之前的结果不会显示,它应该立即根据所选选项卡显示结果。

我正在使用ListAdapter 并使用submitList() 更新数据

这是我使用的适配器:

class GeneralEventRecyclerViewAdapter(val mContext: Context): ListAdapter<Event, RecyclerView.ViewHolder>(DIFF_CALLBACK) {

    lateinit var mOnEventKMListener : OnEventKMListener

    fun setOnItemClickListener(listener: OnEventKMListener) {
        mOnEventKMListener = listener
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_general_event, parent, false)
        return GeneralEventViewHolder(itemView, mOnEventKMListener)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

        val currentEvent = getItem(position)
        val generalEventViewHolder = holder as GeneralEventViewHolder

        Glide.with(mContext).load(currentEvent.thumbnailDownloadPath)
            .apply(RequestOptions.bitmapTransform(BlurTransformation(25, 3)))
            .into(generalEventViewHolder.blurThumbnailImageView)

        Glide.with(mContext).load(currentEvent.thumbnailDownloadPath).into(generalEventViewHolder.thumbnailImageView)


        generalEventViewHolder.eventNameTextView.text = currentEvent.title
        generalEventViewHolder.eventVenueTextView.text = currentEvent.venue
        generalEventViewHolder.eventDateTimeTextView.text = DateTimeService.changeDateToString("EEEE, d MMMM. HH:mm zzz",currentEvent.dateTimeStart)

    }


    companion object {

        private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Event>() {
            override fun areItemsTheSame(oldItem: Event, newItem: Event): Boolean {
                return oldItem.eventID == newItem.eventID
            }

            override fun areContentsTheSame(oldItem: Event, newItem: Event): Boolean {
                return oldItem == newItem
            }


        }
    }


}

这是简化的我的片段类:

class SearchResultFragment : Fragment() {

    lateinit var titleTextView: TextView
    lateinit var progressBar : ProgressBar
    lateinit var fragmentView : View
    lateinit var tabLayout : TabLayout
    lateinit var recyclerView : RecyclerView

    lateinit var mContext : Context
    lateinit var mActivity : FragmentActivity
    lateinit var eventAdapter : GeneralEventRecyclerViewAdapter

    private var eventList = ArrayList<Event>()
    private var selectedEventType = EventType.kajianUmum
    private var selectedCity = City.defaultCityName
    private var selectedTime = EventTimeUserSelection.Weekend
    lateinit var userData : User

    private var startingDate = Date()
    private var endingDate = Date()

    override fun onAttach(context: Context) {
        super.onAttach(context)

        mContext = context
        activity?.let { mActivity = it }

    }



    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        fragmentView = inflater.inflate(R.layout.fragment_search_result, container, false)

        setUpSafeArg()
        setUpViewsDeclaration()
        setUpListeners()
        updateUI()
        setHasOptionsMenu(true)

        initRecyclerView()
        searchEvents()




        return fragmentView
    }



    private fun setUpViewsDeclaration() {
        titleTextView = mActivity.findViewById(R.id.destination_label_text_view)
        progressBar = mActivity.progressBar_main_activity
        recyclerView = fragmentView.findViewById(R.id.recyclerView_search_result)
        tabLayout = fragmentView.findViewById(R.id.tabLayout_time_search_result)

    }



    private fun setUpListeners() {

        tabLayout.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {

            override fun onTabSelected(tab: TabLayout.Tab?) {

                selectedTime = when(tab?.position ?: 0) {
                    0 -> EventTimeUserSelection.All
                    1 -> EventTimeUserSelection.Today
                    2 -> EventTimeUserSelection.Tomorrow
                    3 -> EventTimeUserSelection.Weekend
                    4 -> EventTimeUserSelection.ThisWeek
                    5 -> EventTimeUserSelection.NextWeek
                    else -> EventTimeUserSelection.All
                }

                searchEvents()


            }

            override fun onTabReselected(tab: TabLayout.Tab?) {

            }

            override fun onTabUnselected(tab: TabLayout.Tab?) {

            }


        })

    }


    private fun initRecyclerView() {

        eventAdapter = GeneralEventRecyclerViewAdapter(mContext)
        val layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL,false)
        recyclerView.adapter = eventAdapter
        recyclerView.layoutManager = layoutManager


        eventAdapter.setOnItemClickListener(object: OnEventKMListener {

            override fun eventKMClicked(position: Int) {
                val selectedEvent = eventList[position]
                val eventDetailDestination = SearchResultFragmentDirections.actionGlobalDestinationEventDetail(selectedEvent)
                Navigation.findNavController(fragmentView).navigate(eventDetailDestination)
            }

        })




    }

    private fun searchEvents() {

        setStartingAndEndingDateForSearching()
        progressBar.visibility = View.VISIBLE
        recyclerView.visibility = View.GONE


        FirestoreKMClient.getFreeEvents(startingDate,endingDate,selectedCity,selectedEventType.getEventTypeInString(),10) { errorMessage, events ->


            errorMessage?.let {
                mActivity.toast(it)
            } ?: run {

                val theEvents = events ?: ArrayList()
                eventList = theEvents
                eventAdapter.submitList(eventList)
            }

            progressBar.visibility = View.GONE
            recyclerView.visibility = View.VISIBLE


        }


    }


}

Java 没问题

【问题讨论】:

  • 您能在您将列表与适配器绑定的位置显示您的代码吗?

标签: android kotlin android-recyclerview android-adapter


【解决方案1】:

我不擅长 kotlin,但我的逻辑可能会起作用;

阅读您的代码后;

我想您可以先尝试将您的适配器设置为 null,以便它会清除所有以前在您的第一个选项卡上获取的数据。

eventAdapter.submitList(null)

你可以试着把它放在这里:

 private fun searchEvents() {

        setStartingAndEndingDateForSearching()
        progressBar.visibility = View.VISIBLE
        recyclerView.visibility = View.GONE
        eventAdapter.submitList(null)

【讨论】:

    【解决方案2】:

    在从数据库调用数据时,您应该清除列表。

    尝试在调用新数据之前设置空列表,即在recyclerView.visibility = View.GONE这一行下方的searchEvents()函数中。

    recyclerView.visibility = View.GONE
    eventList = arrayOf< Event>()
    eventAdapter.submitList(eventList)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      相关资源
      最近更新 更多