更改列表项布局时 RecyclerView 滚动到顶部

When changing list item layout RecyclerView scrolls to top

在我的 RecyclerView OnLongClicking 项目中,我想通过将一些 TextViews 设置为 View.GONE 并将其他设置为 View.VISIBLE 来更改该项目的布局。一切正常,除了当我长按该项目并且布局发生变化时,我的 RecyclerView 滚动到顶部并且我再也看不到 LongPressed 视图(如果它位于底部)。

这是我写的ListAdapter

class AssetsListAdapter(
    private val onAssetClickListener: OnAssetClickListener,
    private val onAssetLongClickListener: OnAssetLongClickListener
) :
    ListAdapter<Asset, AssetsListAdapter.ViewHolder>(
        AssetDiffCallback()
    ) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        return ViewHolder(
            inflater.inflate(
                R.layout.list_item,
                parent,
                false
            )
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position), onAssetClickListener, onAssetLongClickListener)
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun bind(
            asset: Asset,
            onAssetClickListener: OnAssetClickListener,
            onAssetLongClickListener: OnAssetLongClickListener
        ) {
            itemView.item_name.text = asset.name

            // Set icons relatively to category
            when (asset.category) {
                "Cash" -> itemView.item_image.setImageResource(R.drawable.ic_cash)
                "Bank Account" -> itemView.item_image.setImageResource(R.drawable.ic_bank)
                "Investment" -> itemView.item_image.setImageResource(R.drawable.ic_invest)
                "Salary" -> itemView.item_image.setImageResource(R.drawable.ic_job)
            }

            itemView.setOnClickListener {
                onAssetClickListener.onAssetClick(asset)
            }

            // On long click listeners pulls up quick action options
            itemView.setOnLongClickListener {
                view.item_end_text.visibility = View.GONE
                view.quick_actions_layout.visibility = View.VISIBLE
                onAssetLongClickListener.onAssetLongClick(asset, itemView)
                true
            }
        }

    }

    class AssetDiffCallback : DiffUtil.ItemCallback<Asset>() {
        override fun areItemsTheSame(oldItem: Asset, newItem: Asset): Boolean {
            return oldItem.assetId == newItem.assetId
        }

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

    interface OnAssetClickListener {
        fun onAssetClick(asset: Asset)
    }

    interface OnAssetLongClickListener {
        fun onAssetLongClick(asset: Asset, view: View)
    }

}

好的,所以我发现如果你设置 View.GONE 整个项目会被重绘并重置 RecyclerView?因为将它设置为 View.INVISIBLE 可以解决问题。

itemView.setOnLongClickListener {
            view.item_end_text.visibility = View.GONE
            view.quick_actions_layout.visibility = View.VISIBLE
            onAssetLongClickListener.onAssetLongClick(asset, itemView)
            true
        }

itemView.setOnLongClickListener {
                view.item_end_text.visibility = View.INVISIBLE
                view.quick_actions_layout.visibility = View.VISIBLE
                onAssetLongClickListener.onAssetLongClick(asset, itemView)
                true
            }