最小化和最大化应用程序时,RecyclerView 项目选择无法按预期工作

问题描述 投票:0回答:1

最小化我的应用程序并再次返回我的应用程序以从回收器视图中选择项目后,将回收器视图项目标记为选中的图像视图复选框和颜色过滤器消失,但当我选择任何下一个项目时,该项目将显示图像视图复选框和颜色过滤器。我必须再次重新选择第一个选定的项目才能显示图像视图复选框和滤色器。 注意:如果应用程序最大化和 recyclerview 项目选择之间存在时间延迟,则一切正常。 我已附上我的代码。非常感谢任何帮助或指导。

图像适配器代码:


    var file: ArrayList<WhatsAppStatus>,

    var context: Context,

    private val listener: RecyclerViewSelectionListener

) :

    RecyclerView.Adapter<ImageAdapter.ImageViewHolder>() {

    private val selectedItems = ArrayList<WhatsAppStatus>()



    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {

        val itemView =

            LayoutInflater.from(parent.context).inflate(R.layout.image_item, parent, false)

        return ImageViewHolder(itemView)

    }



    override fun getItemCount(): Int {

        return file.size;

    }



    fun notifySelectAll() {

//        recyclerView.adapter?.notifyDataSetChanged()

        selectedItems.clear()

        file.forEach {

            it.isSelected = true

            selectedItems.add(it)

        }

        notifyDataSetChanged()

    }

    fun clearSelected() {

//        recyclerView.adapter?.notifyDataSetChanged()

        selectedItems.clear()

        // Perform clearing asynchronously

            file.forEach {

                it.isSelected = false

        }

        notifyDataSetChanged()

    }

    fun selectedSize(): Int {

//        recyclerView.adapter?.notifyDataSetChanged()

       return selectedItems.size

    }

    interface RecyclerViewSelectionListener {

        fun onItemSelected(selectedStatus: WhatsAppStatus, size: Int)

    }

    fun isEmpty(): Boolean {

            return selectedItems.isEmpty()

    }

    fun downloadItem(): ArrayList<WhatsAppStatus> {

            return selectedItems

    }

    override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {

        val currentItem = file[position]

        if (currentItem.isSelected) {

            holder.image.setColorFilter(R.color.black)

            holder.checkBox.visibility=View.VISIBLE

        } else {

            holder.image.clearColorFilter()

            holder.checkBox.visibility=View.GONE

        }

        Glide.with(context).load(currentItem.documentFile.uri).into(holder.image)

        holder.image.setOnClickListener({

            currentItem.isSelected = !currentItem.isSelected

            if (currentItem.isSelected) {

                holder.image.setColorFilter(R.color.black)

                holder.checkBox.visibility=View.VISIBLE

                selectedItems.add(currentItem)

            } else {

                holder.image.clearColorFilter()

                holder.checkBox.visibility=View.GONE

                selectedItems.remove(currentItem)

            }

            listener.onItemSelected(currentItem,selectedItems.size)

//            notifyItemChanged(position)

        })



    }



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

        val image: ImageView = itemView.findViewById(R.id.imageView)

        val checkBox: ImageView = itemView.findViewById(R.id.checkBox)

    }

}```



**ImageFragment Code:**

class ImageFragment : Fragment(), ImageAdapter.RecyclerViewSelectionListener, ImageAdapterListener {

    // TODO: Rename and change types of parameters

    private var param1: String? = null

    private var param2: String? = null

    private lateinit var recyclerView: RecyclerView

    private lateinit var imageFile: ArrayList<WhatsAppStatus>





    @RequiresApi(Build.VERSION_CODES.Q)

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        arguments?.let {

            param1 = it.getString(ARG_PARAM1)

            param2 = it.getString(ARG_PARAM2)

        }



    }



    override fun onCreateView(

        inflater: LayoutInflater, container: ViewGroup?,

        savedInstanceState: Bundle?

    ): View? {

        // Inflate the layout for this fragment

        return inflater.inflate(R.layout.fragment_image, container, false)

    }



    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        super.onViewCreated(view, savedInstanceState)

        recyclerView = view.findViewById(R.id.imageRecyclerView)

        imageFile = ArrayList()

        recyclerView.layoutManager = GridLayoutManager(context, 2)

        recyclerView.setHasFixedSize(true)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            accessStatusesFolder()

        }

        recyclerView.adapter = ImageAdapter(imageFile, requireContext(), this)

    }





    companion object {

        /**

         * Use this factory method to create a new instance of

         * this fragment using the provided parameters.

         *

         * @param param1 Parameter 1.

         * @param param2 Parameter 2.

         * @return A new instance of fragment ImageFragment.

         */

        // TODO: Rename and change types and number of parameters

        @JvmStatic

        fun newInstance(param1: String, param2: String) =

            ImageFragment().apply {

                arguments = Bundle().apply {

                    putString(ARG_PARAM1, param1)

                    putString(ARG_PARAM2, param2)

                }

            }

    }







    @RequiresApi(Build.VERSION_CODES.O)

    fun accessStatusesFolder() {

        AccessStatusesTask().execute()

    }



    inner class AccessStatusesTask : AsyncTask<Void, Void, List<WhatsAppStatus>>() {

        override fun doInBackground(vararg params: Void?): List<WhatsAppStatus> {

            val list = requireActivity().contentResolver.persistedUriPermissions

            val documentFile = DocumentFile.fromTreeUri(requireContext(), list[0].uri)



            val statusFiles = documentFile?.listFiles()

            val newImageFiles = ArrayList<WhatsAppStatus>()



            statusFiles?.forEach { statusFile ->

                // Get the status file name.

                val statusFileName = statusFile.name

                val whatsAppStatus = WhatsAppStatus(statusFile)

                if (statusFileName != null) {

                    if (statusFileName.endsWith(".jpg") || statusFileName.endsWith(".jpeg")

                        || statusFileName.endsWith(".png") || statusFileName.endsWith(".gif") ||

                        statusFileName.endsWith(".webp") || statusFileName.endsWith(".bmp")

                    )

                        newImageFiles.add(whatsAppStatus)

                }

            }

            imageFile.clear()

            return newImageFiles

        }



        override fun onPostExecute(result: List<WhatsAppStatus>?) {

            result?.let {



                imageFile.addAll(it)

                notifyAdapterDataSetChanged(this@ImageFragment)

            }

        }

    }



    fun downloadAll() {

        DownloadAllTask().execute()

    }



    inner class DownloadAllTask : AsyncTask<Void, Void, Unit>() {

        override fun onPreExecute() {

            super.onPreExecute()



        }

        override fun doInBackground(vararg params: Void?) {

            val selectedItem = (recyclerView.adapter as ImageAdapter).downloadItem().toList()  // Create a copy



            selectedItem.forEach {

                val savedStatusFile = File(

                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath +

                            "/statusFileName/" + it.documentFile.name

                )

                copyFile(it.documentFile, savedStatusFile)

            }

        }

        override fun onPostExecute(result: Unit?) {

            result?.let {

                (activity as StickerActivity).updateToolbarNormalMenu()

                notifyAdapterDataSetChanged(this@ImageFragment)

            }

        }

    }







    private fun copyFile(statusFile: DocumentFile, savedStatusFile: File) {

        val inputStream = requireContext().contentResolver.openInputStream(statusFile.uri) ?: return



        try {

            val outputStream = FileOutputStream(savedStatusFile)

            val buffer = ByteArray(1024)

            var bytesRead: Int

            while (inputStream.read(buffer).also { bytesRead = it } > 0) {

                outputStream.write(buffer, 0, bytesRead)

            }

            outputStream.close()

        } catch (e: IOException) {

            Log.e("MainActivity", "Failed to copy file: ${e.message}")

        } finally {

            inputStream.close()

        }

    }



    override fun onStart() {

        super.onStart()

        (activity as StickerActivity).updateToolbarNormalMenu()

        notifyAdapterDataSetChanged(this@ImageFragment)

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            accessStatusesFolder()

        }



//        Toast.makeText(context, "onStart", Toast.LENGTH_SHORT).show()





    }



    override fun onPause() {

        super.onPause()

//        notifyAdapterDataSetChanged(this@ImageFragment)

//        notifyAdapterDataSetChanged(this)

//        (activity as StickerActivity).updateToolbarNormalMenu()

//        recyclerView.adapter?.notifyDataSetChanged()

    }





    override fun onItemSelected(selectedStatus: WhatsAppStatus, size: Int) {

        (activity as StickerActivity).onItemSelected(selectedStatus, size)

    }



    override fun notifyAdapterDataSetChanged(fragment: ImageFragment) {

        (recyclerView.adapter as ImageAdapter).clearSelected()

    }



    fun isEmpty(): Boolean {

        return (recyclerView.adapter as ImageAdapter).isEmpty()

    }



    fun notifySelectAll() {

//        recyclerV

iew.adapter?.notifyDataSetChanged()

        (recyclerView.adapter as ImageAdapter).notifySelectAll()

    }



    fun notifySize(): Int {

//        recyclerView.adapter?.notifyDataSetChanged()

        return (recyclerView.adapter as ImageAdapter).selectedSize()

    }

}
android kotlin android-studio android-recyclerview android-lifecycle
1个回答
0
投票

我使用会话助手类完成了类似的任务。我保存了会话中的最后一项。当用户返回到应用程序时,我从会话助手中检索数据并以这种方式解决问题。您可能想尝试一下这种方法。

添加您的方法 sessionhelper 类:-

fun setCollectionSaveData(value:String){
        editor!!.putString(KEY_COLLECTION_SAVE_DATA, value)
        editor!!.commit()
    }
    fun getCollectionSaveData():String?{
        val s = preferences.getString(KEY_COLLECTION_SAVE_DATA, "")
        return s
    }

设置数据:-

sessionHelper.setCollectionSaveData("saved")

获取数据:-

var savedData = sessionHelper.getCollectionSaveData()
        if(!savedData.isNullOrEmpty()){
//Set your condition
}
© www.soinside.com 2019 - 2024. All rights reserved.