【发布时间】: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