RecyclerView不绑定数据notifyDataSetChanged在过滤器数据时不起作用

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

我有两个屏幕,第一个屏幕具有数据的回收站视图列表,在其上方的searchView过滤此回收站中的数据,第一个片段的视图模型代码

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("getDataInquiary", 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()
    }
}

适配器是:

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
        }
    }
}

此回收站中的任何数据都单击片段后,拖曳回收站的第一个显示数据,第二个则选择图像第二页代码

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)

    }
}

视图模型是:

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
}
}

适配器代码为:

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()
            }
        }
    }

}

[如果您使用第一页中的搜索视图过滤数据并选择第二页中的图像,则选择的图像列表不会出现,如果您转到第二页而不过滤数据,则一切正常

android kotlin android-recyclerview
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.