Search code examples
androidkotlinandroid-fragmentsbaseadapterandroid-gridview

GridView Adapter duplicate the same list every once I leave the fragment and re-open it again


Recently I noticed a problem in my app when I close viewAllfragment and re-open it again, I see the list is duplicated again and again each time with the same data, I tried to clear the list when the fragment was destroyed and submit the data only when the adapter is empty but all of this didn't fix the issue

this the XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.view_all.ViewAllFragment">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"
        android:background="@color/lightGray"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <GridView
        android:id="@+id/gridView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/lightGray"
        android:verticalSpacing="1dp"
        android:horizontalSpacing="1dp"
        android:visibility="gone"
        tools:visibility="visible"
        android:numColumns="auto_fit"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

and this GridProductAdapter code

class GridProductAdapter : BaseAdapter() {

    private var productScrollModelList = arrayListOf<HorizontalProductScrollModel>()

//    init {
//
//    }

    fun submitList(productScrollModelList: List<HorizontalProductScrollModel>){
        this.productScrollModelList.addAll(productScrollModelList)
        notifyDataSetChanged()

        Log.d(TAG, "submitList: size ${productScrollModelList.size}")
    }

    fun clearList(){
        this.productScrollModelList.clear()
        notifyDataSetChanged()
    }

    override fun getCount(): Int {
        return productScrollModelList.size
    }

    override fun getItem(i: Int): Any? {
        return null
    }


    override fun getItemId(i: Int): Long {
        return 0
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

        var localConvertView: View? = convertView

        val binding: HorizontalScrollItemLayoutBinding

        if (localConvertView == null) {
            binding = HorizontalScrollItemLayoutBinding.inflate(
                LayoutInflater.from(parent.context)
            )
            localConvertView = binding.root
            localConvertView.setTag(R.id.viewBinding, binding)
        } else {
            binding = localConvertView.getTag(R.id.viewBinding) as HorizontalScrollItemLayoutBinding
        }

//        binding.hsProductImage.setImageResource(productScrollModelList.get(position).getProductImage());
        Glide.with(binding.root.context)
            .load(productScrollModelList[position].productImage)
            .placeholder(R.drawable.placeholder_image)
            .into(binding.hsProductImage)
        binding.hsProductName.text = productScrollModelList[position].productName
        binding.hsProductDescription.text = productScrollModelList[position].productDescription
        binding.hsProductPrice.text = "Rs.${productScrollModelList[position].productPrice}/-"

//        binding.getRoot().setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//
//            }
//        });
        return localConvertView
    }
}

and I use it in viewAllfragment like the following

   private var _binding: FragmentViewAllBinding? = null
    private val binding get() = _binding!!

    private val LAYOUT_CODE = 0
    private val wishList= arrayListOf<WishListModel>()

    private val wishlistAdapter = WishlistAdapter(false)

    private val args by navArgs<ViewAllFragmentArgs>()

    private var layoutCode:Int =0

    private val gridProductAdapter by lazy { GridProductAdapter()  }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentViewAllBinding.inflate(inflater)

        layoutCode = args.layoutCode
        (requireActivity() as MainActivity).fragmentTitleAndActionBar(args.title)

        return binding.root
    }

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



        if(layoutCode == 0) {

            wishList.addAll(args.viewAllProductList!!)

            wishlistAdapter.asyncListDiffer.submitList(wishList)
//            wishlistAdapter.submitList(wishList)

            binding.recyclerView.apply {
                visibility = View.VISIBLE
                layoutManager = LinearLayoutManager(requireContext(),LinearLayoutManager.VERTICAL,false)
                adapter = wishlistAdapter
            }

        }else if(layoutCode == 1) {

            //================ Horizontal list ======================//

            binding.gridView.visibility = View.VISIBLE

            binding.gridView.adapter = gridProductAdapter

            Log.d(TAG, "onViewCreated: horizontalProductScrollModelList size ${args.horizontalProductScrollModelList.size}")

            if(gridProductAdapter.isEmpty) {
                gridProductAdapter.submitList(args.horizontalProductScrollModelList.toList())
            }
        }

    }

    override fun onDestroyView() {
        super.onDestroyView()
        gridProductAdapter.clearList()
        _binding = null
    }

Solution

  • I fixed the problem by clearing the args.horizontalProductScrollModelList that I got from HomeFragment before I opened the viewAllfragment

    override fun onDestroyView() {
        super.onDestroyView()
       gridLayoutList.clear()
    }