当前位置: 首页 > 知识库问答 >
问题:

Android页面使用滑动刷新CoordinatorLayout内部获得错误

东门令
2023-03-14

recyclerview一致性错误一个第一次刷新工作正常,第二次刷新获取错误。堆栈中没有行号。

    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:aapt="http://schemas.android.com/aapt"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/parent_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:background="@color/white_color">
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
            android:id="@+id/swipe_refresh_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rvPost"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipToPadding="false"
                android:orientation="vertical"
                android:paddingTop="19dp"
                app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"
                app:spanCount="3" />
        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
    </androidx.coordinatorlayout.widget.CoordinatorLayout>

SwipeRefreshLayout   swipeRefreshLayout = getView().findViewById(R.id.swipe_refresh_layout);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                viewModel.refresh();
            }
        });
class DiscoverAdapter(private val action: (b: Int?) -> Unit)
    : PagedListAdapter<PostModel, RecyclerView.ViewHolder>(NewsDiffCallback) {

    private val DATA_VIEW_TYPE = 1
    private val FOOTER_VIEW_TYPE = 2

    private var state = State.LOADING

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return if (viewType == DATA_VIEW_TYPE) DiscoverViewHolder.create(parent) else ListFooterViewHolder.create(parent)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        if (getItemViewType(position) == DATA_VIEW_TYPE)
            (holder as DiscoverViewHolder).bind(action, getItem(position))
        else (holder as ListFooterViewHolder).bind(action, state)
    }

    override fun getItemViewType(position: Int): Int {
        return if (position < super.getItemCount()) DATA_VIEW_TYPE else FOOTER_VIEW_TYPE
    }

    companion object {
        val NewsDiffCallback = object : DiffUtil.ItemCallback<PostModel>() {
            override fun areItemsTheSame(oldItem: PostModel, newItem: PostModel): Boolean {
                return oldItem.id == newItem.id
            }

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

    override fun getItemCount(): Int {
        return super.getItemCount() + if (hasFooter()) 1 else 0
    }

    private fun hasFooter(): Boolean {
        return super.getItemCount() != 0 && (state == State.LOADING || state == State.ERROR)
    }

    fun setState(state: State) {
        this.state = state
        notifyItemChanged(super.getItemCount())
    }

    fun getData(position: Int): PostModel {
        return getItem(position) as PostModel
    }
}
class DiscoverViewHolder(view: View) : RecyclerView.ViewHolder(view) {

    fun bind(retry: (x: Int?) -> Unit, postModel: PostModel?) {
        val width = DeviceScreenUtil.getInstance().width
        val newWidth = width / 3
        val layoutParams = itemView.rl_main_layout.getLayoutParams()
        layoutParams.height = Math.round(newWidth * 1.2f)
        layoutParams.width = Math.round(newWidth.toFloat())
        itemView.rl_main_layout.setPadding(3, 3, 4, 4)
        itemView.rl_main_layout.setLayoutParams(layoutParams)

        if (postModel != null) {
//            itemView.tv_total_like.text = news.title
            if (!postModel.thumbnail.isNullOrEmpty())
                Picasso.get().load(postModel.thumbnail).into(itemView.iv_image)
            itemView.setOnClickListener { retry(adapterPosition) }
            if (postModel.likes > 0) itemView.tv_total_like.setText(postModel.likes.toString() + "")
        }
    }

    companion object {
        fun create(parent: ViewGroup): DiscoverViewHolder {
            val view = LayoutInflater.from(parent.context)
                    .inflate(R.layout.item_myprofile, parent, false)
            return DiscoverViewHolder(view)
        }
    }
}
DiscoverAdapter discoverAdapter = DiscoverAdapter {
        if (it == null) {
            viewModel.retry()
        } else {
            click(it)
        }

    }
    rvPost.adapter = discoverAdapter
    viewModel.newsList.observe(this,
            Observer {
                discoverAdapter.submitList(it)
            })

共有1个答案

西门磊
2023-03-14

RecolyerView适配器中存在问题,我想您忘记了进行适配器。rNotifyDataChanged()刷新后再次设置数据时:)

请打印适配器代码

 类似资料:
  • 我正在开发一个应用程序,其中我使用了AppBarLayout和CollapsingToolbarLayout以及NestedScrollView。我已经成功地实现了这一点,并且运行良好。 现在我想做的是,在嵌套滚动视图上滑动(快速向上滑动)时,它应该完全滚动到顶部。类似地,在向屏幕底部滑动(快速向下滑动)时,它必须平滑地滚动到底部。然而现在,它只能卡在中间,这使它看起来很丑。我已经尝试了许多可用的

  • 我正在使用查看寻呼机和片段。我有三个可旋转的标签。每个扩展片段。我希望他们在刷卡时刷新。如何实现这一点?现在,当我滑动时,选项卡不会刷新。 请帮忙

  • 问题内容: 如何定期使用PHP刷新页面?如果我用PHP无法做到这一点,那么最好的推荐方案是什么? 问题答案: 您可以使用PHP来做到这一点: 它会刷新您的当前页面,如果需要将其重定向到另一个页面,请使用以下命令:

  • 我有一个活动,带有一个可视页面,涵盖了整个活动。在这个ViewPager中是一个ListView,它只覆盖片段的底部。ListView可以识别滑动事件(您可以左右滑动项目),但当您想滑动列表项目时,ViewPager会切换页面,因此无法工作。有没有一种简单的方法来解决这个问题,这样ViewPager就不会收到列表中的触摸事件。 谢谢

  • 假设有一个网页,它是显示现场比赛成绩或股票市场状况或货币兑换率。对于所有这些类型的页面,您需要定期刷新网页。 Java Servlet 提供了一个机制,使得网页会在给定的时间间隔自动刷新。 刷新网页的最简单的方式是使用响应对象的方法 setIntHeader()。以下是这种方法的定义: public void setIntHeader(String header, int headerValue

  • 本文向大家介绍在Laravel中实现使用AJAX动态刷新部分页面,包括了在Laravel中实现使用AJAX动态刷新部分页面的使用技巧和注意事项,需要的朋友参考一下 AJAX相信大家都不陌生,有很多不同的Javascript Frameworks可以用来快速实现AJAX功能。那么今天我们一起来看一下如何在使用了PHP Frameworks的网站中使用AJAX来刷新页面的一小部分。 这里我使用的是jQ