Android 片段中的Recycler视图不显示任何数据,尽管PagingSource日志更正了数据
我试图在片段中的回收器视图中显示RESTful Api。当应用程序运行时,不会显示任何错误,但不会在“回收器”视图中加载任何内容。我在Android 片段中的Recycler视图不显示任何数据,尽管PagingSource日志更正了数据,android,kotlin,mvvm,Android,Kotlin,Mvvm,我试图在片段中的回收器视图中显示RESTful Api。当应用程序运行时,不会显示任何错误,但不会在“回收器”视图中加载任何内容。我在PagingSource文件中记录了响应,它显示了正确的数据,但在recycler视图中仍然没有显示任何内容 这是我的Api接口: interface Api { companion object { const val BASE_URL = "http://be7c232bf30e.ngrok.io" }
PagingSource
文件中记录了响应,它显示了正确的数据,但在recycler视图中仍然没有显示任何内容
这是我的Api接口:
interface Api {
companion object {
const val BASE_URL = "http://be7c232bf30e.ngrok.io"
}
@GET("/posts")
suspend fun searchPosts(
@Query("_page") page: Int,
@Query("_limit") perPage: Int
): List<SocialNetworkPost>
}
这是一个片段,其中recyclerView是:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val postAdapter = PostsAdapter(this)
binding.apply {
recyclerView.apply {
setHasFixedSize(true)
itemAnimator = null
adapter = postAdapter.withLoadStateHeaderAndFooter(
header = PostsLoadStateAdapter { postAdapter.retry() },
footer = PostsLoadStateAdapter { postAdapter.retry() }
)
buttonRetry.setOnClickListener {
postAdapter.retry()
}
}
}
viewModel.posts.observe(viewLifecycleOwner) {
postAdapter.submitData(viewLifecycleOwner.lifecycle, it)
}
postAdapter.addLoadStateListener { loadState ->
binding.apply {
progressBar.isVisible = loadState.source.refresh is LoadState.Loading
recyclerView.isVisible = loadState.source.refresh is LoadState.NotLoading
buttonRetry.isVisible = loadState.source.refresh is LoadState.Error
textViewError.isVisible = loadState.source.refresh is LoadState.Error
// empty view
if (loadState.source.refresh is LoadState.NotLoading && loadState.append.endOfPaginationReached && postAdapter.itemCount < 1) {
recyclerView.isVisible = false
textViewEmpty.isVisible = true
} else {
textViewEmpty.isVisible = false
}
}
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onItemClick(post: SocialNetworkPost) {
val action = HomeFragmentDirections.actionHomeFragmentToDetailsFragment(post)
findNavController().navigate(action)
}
}
这是我的适配器:
class PostsAdapter(private val listener: OnItemClickListener) : PagingDataAdapter<SocialNetworkPost, PostsAdapter.PostViewHolder>(POSTS_COMPARATOR) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
val binding = ItemPostBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return PostViewHolder(binding)
}
override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
val currentItem = getItem(position)
if (currentItem != null) {
Log.d("PostAdapter", "onBindViewHolder: if")
holder.bind(currentItem)
} else {
Log.d("PostAdapter", "onBindViewHolder: else")
}
}
inner class PostViewHolder(private val binding: ItemPostBinding) : RecyclerView.ViewHolder(binding.root) {
init {
binding.root.setOnClickListener {
val position = bindingAdapterPosition
if (position != RecyclerView.NO_POSITION) {
val item = getItem(position)
if (item != null) listener.onItemClick(item)
}
}
}
fun bind(post: SocialNetworkPost) {
Log.d("PostAdapter", "bind: $post")
binding.apply {
Glide.with(itemView)
.load(post.accountIcon)
.centerCrop()
.transition(DrawableTransitionOptions.withCrossFade())
.error(R.drawable.ic_account)
.into(imageViewProfilePicture)
textViewName.text = post.accountName
textViewDescription.text = post.description
Glide.with(itemView)
.load(post.descriptionImage)
.centerCrop()
.transition(DrawableTransitionOptions.withCrossFade())
.error(R.drawable.empty)
.into(imageViewDescription)
textViewLikesAmount.text = "Likes: ${post.likesAmount}"
textViewCommentsAmount.text = "Comments: ${post.commentsAmount}"
}
}
}
interface OnItemClickListener {
fun onItemClick(post: SocialNetworkPost)
}
companion object {
private val POSTS_COMPARATOR = object : DiffUtil.ItemCallback<SocialNetworkPost>() {
override fun areItemsTheSame(oldItem: SocialNetworkPost, newItem: SocialNetworkPost) = oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: SocialNetworkPost, newItem: SocialNetworkPost) = oldItem == newItem
}
}
}
class PostsAdapter(私有val侦听器:OnItemClickListener):PagingDataAdapter(POSTS\u COMPARATOR){
重写CreateViewHolder(父级:ViewGroup,viewType:Int):PostViewHolder{
val binding=ItemPostBinding.inflate(LayoutInflater.from(parent.context),parent,false)
返回PostViewHolder(绑定)
}
覆盖BindViewHolder(holder:PostViewHolder,位置:Int){
val currentItem=getItem(位置)
如果(currentItem!=null){
Log.d(“PostAdapter”、“onBindViewHolder:if”)
持有者绑定(当前项)
}否则{
Log.d(“PostAdapter”、“onBindViewHolder:else”)
}
}
内部类PostViewHolder(私有val绑定:ItemPostBinding):RecyclerView.ViewHolder(binding.root){
初始化{
binding.root.setOnClickListener{
val位置=绑定适配器位置
如果(位置!=RecyclerView.无位置){
val item=getItem(位置)
if(item!=null)listener.onItemClick(item)
}
}
}
趣味绑定(帖子:SocialNetworkPost){
Log.d(“PostAdapter”、“bind:$post”)
应用{
使用(项目视图)滑动
.load(post.accountIcon)
.centerCrop()
.transition(DrawableTransitionOptions.withCrossFade())
.错误(R.可提取ic_账户)
.into(imageViewProfilePicture)
textViewName.text=post.accountName
textViewDescription.text=post.description
使用(项目视图)滑动
.load(后期描述图像)
.centerCrop()
.transition(DrawableTransitionOptions.withCrossFade())
.错误(R.drawable.empty)
.into(imageViewDescription)
textViewLikesAmount.text=“Likes:${post.likesAmount}”
textViewCommentsAmount.text=“注释:${post.commentsAmount}”
}
}
}
接口侦听器{
趣味网络点击(帖子:社交网络帖子)
}
伴星{
private val POSTS\u COMPARATOR=object:DiffUtil.ItemCallback(){
覆盖有趣的项目相同(旧项目:SocialNetworkPost,新项目:SocialNetworkPost)=oldItem.id==newItem.id
覆盖相同的内容(oldItem:SocialNetworkPost,newItem:SocialNetworkPost)=oldItem==newItem
}
}
}
RecyclerView需要一个layoutManager,您可以在xml中设置它:
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
或按程序:
recyclerView.layoutManager = LinearLayoutManager(requireContext())
RecyclerView需要一个layoutManager,您可以在xml中设置它:
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
或按程序:
recyclerView.layoutManager = LinearLayoutManager(requireContext())
您是否在XML中为RecyclerView设置了layouManager?我在代码里没看到我真不敢相信我错过了。我一整天都在想这个问题。你能写一个答案让我接受吗?你在XML中为RecyclerView设置了layouManager吗?我在代码里没看到我真不敢相信我错过了。我一整天都在想这个问题。你能写个答案让我接受吗?
recyclerView.layoutManager = LinearLayoutManager(requireContext())