Q: RecyclerView not binding data notifyDataSetChanged not working when filter data I have two screens first one has recycler view list of data and searchView above it that's filter data in this recycler, the view Model code of the first fragment
class MscInspectionViewModel(val activity: LaunchActivity, val mRootView: MscInspectFragment) :
    BaseViewModel(),
    SwipeRefreshLayout.OnRefreshListener {


    val toolBarTitle: MutableLiveData<String> = MutableLiveData()
    private val getDataError = MutableLiveData<Boolean>()
    var listType = MutableLiveData<Int>()
    val hint = MutableLiveData<String>()
    private var isRefreshing: Boolean = false

    private var mSharedPreferences: SharedPreferences? = null

    val dataListAdapter = ContainersUnderCheckAdapter(activity)

    val backClickListener = View.OnClickListener { activity.supportFragmentManager.popBackStack() }

    val filterDataByTab = object : TabLayout.OnTabSelectedListener {
        override fun onTabReselected(tab: TabLayout.Tab?) {

        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {
        }

        override fun onTabSelected(tab: TabLayout.Tab?) {
            when (tab!!.text) {
                activity.resources.getString(R.string.cidPending) -> {
                    listType.value = 0
                    getPendingData()
                }
                activity.resources.getString(R.string.cidDone) -> {
                    listType.value = 1
                    getDoneData()
                }
            }
        }
    }

    val filterData = object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            if (query.length > 2) {
                val mQuery = Utility(activity).switchArabicNumerals(query)
                dataListAdapter.getFilter(3, listType.value!!).filter(mQuery)
            } else {
                errorMessage.value = activity.resources.getString(R.string.addCorrectNumber)
            }
            return true
        }

        override fun onQueryTextChange(newText: String): Boolean {
            if (newText.length > 2) {
                val mQuery = Utility(activity).switchArabicNumerals(newText)
                dataListAdapter.getFilter(3, listType.value!!).filter(mQuery)
            }
            return false;
        }
    }
    val closeImgListener = View.OnClickListener {
        mRootView.svSearchMSC.setQuery("", true)
        if (listType.value == 1) {
            dataListAdapter.getFilter(1, listType.value!!).filter("ANY")
        } else if (listType.value == 0) {
            dataListAdapter.getFilter(2, listType.value!!).filter("PENDING")
        }
    }


    init {
        listType.value = 0
        mSharedPreferences = getDefaultSharedPreferences(activity.applicationContext)
        toolBarTitle.value = activity.resources.getString(R.string.mscInspectTitle)
        hint.value = activity.resources.getString(R.string.msc_search)
        getData()
    }

    fun getData() {
        onRetrievePostListStart()
        subscription = apiAccount.getContainersUnderCheck(
            "getContainersUnderCheck",
            mSharedPreferences!!.getString(Constants.CFID, "")!!,
            mSharedPreferences!!.getString(Constants.CFTOKEN, "")!!
        )
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe {}
            .doOnTerminate {}
            .subscribe({ result ->
                result?.let {
                    if (result.ResponseCode != null && result.ResponseCode.trim() != "000") {
                        onRetrievePostListError(result.ResponseMessage)
                    } else {
                        result.ContainersData?.let { it1 -> onRetrievePostListSuccess(it1) }
                    }
                }
            }, { throwable ->
                android.util.Log.e("getDataInquiry", throwable.message!!)
                onRetrievePostListError(activity.resources.getString(R.string.general_error))
            })
    }

    private fun getPendingData() {
        val query = mRootView.svSearchMSC.query.toString()
        if (query == "") {

            dataListAdapter.getFilter(2, listType.value!!).filter("PENDING")
        } else {
            if (query.length > 2) {
                dataListAdapter.getFilter(3, listType.value!!).filter(query)
            } else {
                errorMessage.value = activity.resources.getString(R.string.addCorrectNumber)
            }
        }
    }

    private fun getDoneData() {
        val query = mRootView.svSearchMSC.query.toString()
        if (query == "") {

            dataListAdapter.getFilter(1, listType.value!!).filter("ANY")
        } else {
            if (query.length > 2) {
                dataListAdapter.getFilter(3, listType.value!!).filter(query)
            } else {
                errorMessage.value = activity.resources.getString(R.string.addCorrectNumber)
            }
        }

    }

    private fun onRetrievePostListStart() {
        loading.value = true
    }

    private fun onRetrievePostListFinish() {
        loading.value = false
        isRefreshing = false
    }

    private fun onRetrievePostListSuccess(containersData: List<ContainersData>) {
        onRetrievePostListFinish()
        dataListAdapter.updateInquiryAdapter(containersData as ArrayList<ContainersData>)
        if (listType.value == 1) {
            dataListAdapter.getFilter(1, listType.value!!).filter("ANY")
        } else if (listType.value == 0) {
            dataListAdapter.getFilter(2, listType.value!!).filter("PENDING")
        }

    }

    private fun onRetrievePostListError(message: String?) {
        onRetrievePostListFinish()
        getDataError.value = true
        errorMessage.value = message

    }

    override fun onCleared() {
        super.onCleared()
        subscription.dispose()
    }

    override fun onRefresh() {

        isRefreshing = true
        getData()
    }
}

adapter is :
class ContainersUnderCheckAdapter(val activity: LaunchActivity) :
    RecyclerView.Adapter<ContainersUnderCheckAdapter.ViewHolder>() {

    private lateinit var mDataSet: ArrayList<ContainersData>
    private lateinit var mDataSetFiltered: ArrayList<ContainersData>
    fun updateInquiryAdapter(dataSet: ArrayList<ContainersData>) {
        mDataSet = ArrayList()
        mDataSet.clear()
        mDataSet.addAll(dataSet)
        mDataSetFiltered = mDataSet
        getFilter(2, 1).filter("PENDING")
//        notifyDataSetChanged()
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding: ContianerItemFieldLayoutBinding = DataBindingUtil
            .inflate(
                LayoutInflater.from(parent.context),
                R.layout.contianer_item_field_layout,
                parent,
                false
            )

        return ViewHolder(binding, activity)
    }

    override fun getItemCount(): Int {
        return if (::mDataSetFiltered.isInitialized) mDataSetFiltered.size else 0
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(mDataSetFiltered[position])

    }

    operator fun get(position: Int): ContainersData {
        return mDataSetFiltered.get(position)
    }

    /**
     * @filterType :
     * IF 1 : filter on Data Type RJCTD + APPROVED
     * 2 : filter on Data Type PENDING
     * 3 :
     */
    fun getFilter(filterType: Int, listType: Int): Filter {
        return object : Filter() {

            override fun performFiltering(charSequence: CharSequence): FilterResults {
                val charString = charSequence.toString()
                mDataSetFiltered = if (charString.isEmpty()) {
                    mDataSet
                } else {
                    val filteredList = ArrayList<ContainersData>()
                    for (row in mDataSet) {
                        when (filterType) {
                            1 -> {
                                if (row.status == "RJCTD" || row.status == "APPROVED") {
                                    filteredList.add(row)
                                }
                            }
                            2 -> {
                                if (row.status == charString) {
                                    filteredList.add(row)
                                }
                            }
                            3 -> {
                                when (listType) {
                                    0 -> {
                                        if ((row.CID!!.contains(charString.toUpperCase(Locale.ROOT)) || row.TN!!.contains(
                                                charSequence
                                            ) || row.PN!!.contains(charSequence)) && row.status == "PENDING"
                                        ) {
                                            filteredList.add(row)

                                        }
                                    }
                                    1 -> {
                                        if ((row.CID!!.contains(charString.toUpperCase(Locale.ROOT)) || row.TN!!.contains(
                                                charSequence
                                            ) || row.PN!!.contains(charSequence)) && row.status != "PENDING"
                                        ) {
                                            filteredList.add(row)
                                        }
                                    }
                                }

                            }
                        }


                    }

                    filteredList
                }

                val filterResults = FilterResults()
                filterResults.values = mDataSetFiltered
                return filterResults
            }

            override fun publishResults(
                charSequence: CharSequence,
                filterResults: FilterResults
            ) {
                if (::mDataSetFiltered.isInitialized) {
                    mDataSetFiltered = try {
                        filterResults.values as ArrayList<ContainersData>
                    } catch (e: Exception) {
                        Log.e("mDataSetFiltered",e.message!!)
                        ArrayList()
                    }
                    when (filterType) {
                        1->{
                            mDataSetFiltered.sortWith(Comparator { p0, p1 -> p1!!.UpdateDate.compareTo(p0!!.UpdateDate) })
                        }
                        2->{
                            mDataSetFiltered.sortWith(Comparator { p0, p1 -> p0!!.ID!!.compareTo(p1.ID!!) })
                        }
                    }

                }

                // refresh the list with filtered data
                notifyDataSetChanged()
            }
        }
    }


    class ViewHolder(
        private val binding: ContianerItemFieldLayoutBinding,
        val activity: LaunchActivity
    ) : RecyclerView.ViewHolder(binding.root) {
        private val viewModel = MscInspectionListViewModel(activity)
        fun bind(data: ContainersData) {
            viewModel.bind(data)
            binding.viewModel = viewModel
        }
    }
}

any data in this recycler on click go to fragment has tow recycler first one to show data, the second one to pick Images
the second-page code
class MSCDataFragment : Fragment() {

    lateinit var rootView: View
    lateinit var activity: LaunchActivity
    lateinit var utility: Utility
    lateinit var loadingView: LoadingView

    private lateinit var viewModel: MSCDataViewModel
    private lateinit var binding: FragmentMscdataBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (getActivity() != null) {
            activity = getActivity() as LaunchActivity
            utility = Utility(activity)
            loadingView = LoadingView(activity)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_mscdata, container, false)
        rootView = binding.root
        initial()
        return rootView
    }

    private fun initial() {
        viewModel = ViewModelProvider(
            this, ViewModelFactory(
                activity,
                arguments!!.getSerializable("Data") as ContainersData
            )
        ).get(MSCDataViewModel::class.java)
        binding.viewModel = viewModel

//        binding.imgList.layoutManager = GridLayoutManager(activity, 3)

        binding.containerInfo.layoutManager = LinearLayoutManager(activity)

        binding.openCIDNotValid.typeface =
            Typeface.createFromAsset(activity.assets, "Bahij_Janna-Regular.ttf")

        binding.openCIDNotValid.setOnCheckedChangeListener(viewModel.onOpenCidNotValidListener)

        viewModel.loading.observe(this, Observer { loading ->
            loading?.let {
                if (it) {
                    loadingView.show()
                } else {
                    loadingView.dismiss()
                }
            }
        })

        viewModel.errorMessage.observe(this, Observer { msg ->
            msg?.let {
                utility.ShowToast(msg)
            }
        })

        viewModel.imagesAdapters2.observe(this, Observer { msg ->
            msg?.let {
                binding.imgList.apply {
                    layoutManager = GridLayoutManager(activity, 3)
                    adapter = it
                }
            }
        })


        rootView.toolbar_Back.setOnClickListener(viewModel.backClickListener)

        binding.btnAddImages.setOnClickListener(viewModel.pickImages)

        binding.successContianer.setOnClickListener(viewModel.correctContainer)
        binding.damagedContianer.setOnClickListener(viewModel.wrongContainer)

    }
}

the view model is :
class MSCDataViewModel(val activity: LaunchActivity, val containersData: ContainersData) :
BaseViewModel(), GetImagesListener {



@Inject
lateinit var restApiAccount: RestApiAccount

val toolBarTitle: MutableLiveData<String> = MutableLiveData()
val ButtonText: MutableLiveData<String> = MutableLiveData()
var openCIDNotValidVisibility = MutableLiveData<Int>()
private val getDataError = MutableLiveData<Boolean>()
val btnImagesVisibility = MutableLiveData<Int>()
var imgeNoteVisibility = MutableLiveData<Int>()
var successVisibility = MutableLiveData<Int>()
var damagedVisibility = MutableLiveData<Int>()
var notesVisibility = MutableLiveData<Int>()
val btnVisibility = MutableLiveData<Int>()
var canNotOpen = MutableLiveData<Int>()

private val images = ArrayList<Image>()
var utility = Utility(activity)
private var CURRENTINDEX = 0
private var mSharedPreferences: SharedPreferences? = null

val DataListAdapter = ContainerDataAdapter(activity)
var imagesAdapter = ContainerImagesAdapter(activity, containersData.status!!, ArrayList())
val imagesAdapters2 = MutableLiveData<ContainerImagesAdapter2>()
val userInfo: UserInfo

val backClickListener = View.OnClickListener { activity.supportFragmentManager.popBackStack() }

val pickImages = View.OnClickListener {
    pickImages()
}

val correctContainer = View.OnClickListener {}

val onOpenCidNotValidListener =
    CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
        if (isChecked) {
            successVisibility.value = View.GONE
            canNotOpen.value = 1
        } else {
            canNotOpen.value = 0
            successVisibility.value = View.VISIBLE
        }
    }

val wrongContainer = View.OnClickListener {}

var mscNotes: ObservableField<String> = ObservableField("")

init {
    canNotOpen.value = 0
    mSharedPreferences =
        PreferenceManager.getDefaultSharedPreferences(activity.applicationContext)
    toolBarTitle.value = containersData.CID
    ButtonText.value = activity.resources.getString(R.string.cleanContianer)
    userInfo = utility.readObjectFromSharedPreferences(
        mSharedPreferences,
        Constants.USER_INFO_KEY,
        UserInfo::class.java
    ) as UserInfo

    openCIDNotValidVisibility.value = View.GONE
    fillData()
}

private fun fillData() {
    val data: LinkedHashMap<String, String> = containersData.data!!
    val captionsMap = utility.readObjectFromSharedPreferences(
        mSharedPreferences, Constants.CAPTIONS_MAP_KEY,
        HashMap::class.java
    ) as HashMap<String, String>
    if (containersData.data.size > 0) {
        val list = ArrayList<KeyValueModel>()
        for (inside in data.keys) {
            val ky = captionsMap[inside]
            val value = data[inside].toString()
            ky?.let { KeyValueModel(it, value) }?.let { list.add(it) }
        }
        DataListAdapter.updateInquiryAdapter(list)
    } else {
        errorMessage.value = activity.resources.getString(R.string.no_data)
    }
    if (containersData.ImageList != null && containersData.ImageList.isNotEmpty()) {
        imagesAdapter.updateContainerImagesAdapter(containersData.ImageList)
    }
}

private fun pickImages() {
    activity.setCallBack(this)
    val pictureDialog: AlertDialog
    val builder = activity.let { AlertDialog.Builder(it) }
    val dialogView = View.inflate(activity, R.layout.choose_camera_method, null)
    builder.setView(dialogView)

    val nafithPopupContainer = dialogView.findViewById<RelativeLayout>(R.id.RLTitle)
    nafithPopupContainer.setBackgroundColor(
        ContextCompat.getColor(
            activity,
            R.color.mainColor
        )
    )

    val popUpGallery = dialogView.findViewById<LinearLayout>(R.id.PopupGellary)

    val popUpCamera = dialogView.findViewById<LinearLayout>(R.id.PopupCamera)

    pictureDialog = builder.create()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Objects.requireNonNull<Window>(pictureDialog.window)
            .setLayout(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
            )
    } else {
        if (pictureDialog.window != null) {
            pictureDialog.window!!.setLayout(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
            )
        }
    }
    popUpGallery.setOnClickListener {
        fromGallery()
        pictureDialog.dismiss()
    }

    popUpCamera.setOnClickListener {
        fromCamera()
        pictureDialog.dismiss()
    }

    val popupClose = dialogView.findViewById<ImageView>(R.id.popupClose)
    popupClose.setOnClickListener { pictureDialog.dismiss() }

    pictureDialog.show()
}

private fun fromGallery() {
    ImagePicker.create(activity)
        .toolbarImageTitle(activity.resources.getString(R.string.get_image))
        .toolbarArrowColor(ContextCompat.getColor(activity, R.color.colorWhite))
        .showCamera(false)
        .limit(6)
        .start()
}

private fun fromCamera() {
    ImagePicker.cameraOnly().start(activity)
}

override fun onGetImage(image: Image) {
    imgeNoteVisibility.value = View.GONE
    imagesAdapter.updateContainerImagesAdapter(image)
    images.add(image)
}

override fun addingImagesDone(mImages: MutableList<Image>) {
    images.clear()
    images.addAll(mImages)
    imgeNoteVisibility.value = View.GONE
    val listString :ArrayList<String> = ArrayList()
    for (i in mImages.indices){
        listString.add(mImages[i].path)
    }
    imagesAdapters2.value = ContainerImagesAdapter2(activity,containersData.status!!,listString)
    imagesAdapters2.value!!.notifyItemRangeChanged(0,listString.size)
}


override fun onImgDelete(image: String) {
    var x = 0
    try {
        for (i in 0 until images.size) {
            x = i
            if (images[i].path == image) {
                images.remove(images[i])
            }
        }
    } catch (e: Exception) {
        Log.e("errorImages", e.message!!)
        Log.e("xx", x.toString())
    }
}

private fun onRetrievePostListStart() {
    loading.value = true
}

private fun onRetrievePostListFinish() {
    loading.value = false
}

private fun onRetrievePostListSuccess(msg: String?) {
    onRetrievePostListFinish()
}

private fun onRetrievePostListError(message: String?) {
    onRetrievePostListFinish()
    getDataError.value = true
    errorMessage.value = message
}
}

Adapter code is :
class ContainerImagesAdapter2() : RecyclerView.Adapter<ContainerImagesAdapter2.ViewHolder>() {
    var status: String = ""
    lateinit var activity: LaunchActivity
    lateinit var utility: Utility

    constructor(
        mActivity: LaunchActivity,
        mStatus: String,
        pathsList: ArrayList<String>
    ) : this() {
        activity = mActivity
        pathsDataSet = pathsList
        status = mStatus
        utility = Utility(activity)
    }


    private var pathsDataSet: ArrayList<String> = ArrayList()


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding: ContianerImageFieldBinding = DataBindingUtil
            .inflate(
                LayoutInflater.from(parent.context),
                R.layout.contianer_image_field,
                parent,
                false
            )

        return ViewHolder(binding, activity)
    }

    override fun getItemCount(): Int {
        return pathsDataSet.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bindPath(pathsDataSet[position], position)
    }

    inner class ViewHolder(
        private val binding: ContianerImageFieldBinding,
        val activity: LaunchActivity
    ) : RecyclerView.ViewHolder(binding.root) {
        private val viewModel = MscImagesListViewModel(activity)
        fun bindPath(data: String, position: Int) {
            viewModel.bindPath(data)
            binding.viewModel = viewModel
            if (status != "PENDING") {
                binding.closeImg.visibility = View.GONE
            }
            binding.closeImg.setOnClickListener {}
            binding.mainImg.setOnClickListener {
                val fragment = FullImageFragment()
                val bundle = Bundle()
                val list = ArrayList<String>()
                for (item in 0 until pathsDataSet.size) {
                    list.add(pathsDataSet[item])
                }
                bundle.putSerializable("ImageList", list)
                bundle.putInt("Position", position)
                fragment.arguments = bundle
                activity.supportFragmentManager.beginTransaction()
                    .replace(R.id.fragment_container, fragment).addToBackStack(fragment.tag)
                    .commit()
            }
        }
    }

}

if you filter data using search view in the first-page and pick images in the second page , list of picked images doesn't appear, if you going to the second page without filtering data everything ok

A: solve Problem found 
Just Update constraint-layout library in gradle dependencies to version '2.0.0-beta4'
