Anthraxff
Anthraxff

Reputation: 172

Getting instance of an object from child fragment by parent fragment

Problem:

i have a layout like this:

enter image description here

in the parent fragment i have a searchview responsible for filtering the recyclerviews inside the child fragments.

the child fragments are inside a tablayout viewpager combination.

so the OnQueryTextListener is inside the parent fragment and i have to get an instance of the recyclerviews adapters from child fragments to do the filtering.

what is the proper way to do this?

What I've tried:

i searched and found getChildFramgentManager which returns an instance of the child fragment. but apparently, the fragments should be created dynamically? im not sure how that works with viewpager. so if there is a way to do this with getChildFramgentManager and viewpager please explain.

My code:

everything I've written is the standard procedure and im not that far into the project to add something that changes the outcome so im not gonna take your time by adding the code, but if the code is necessary please say so and i will add it.

Upvotes: 1

Views: 702

Answers (1)

Yoleth
Yoleth

Reputation: 1272

In your viewpager's adapter you can store references to child fragments into a list and iterate through child fragments to call a method.

Something like this :

Parent fragment

class ParentFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val view = inflater.inflate(R.layout.parent_fragment, container, false)

        val search : SearchView = findViewById(R.id.search)
        val pager : ViewPager = findViewById(R.id.pager)

        val adapter = ViewPagerAdapter(supportFragmentManager)
        pager.adapter = adapter

        search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                adapter.filter(query ?: "")
                return true
            }
            override fun onQueryTextChange(newText: String?): Boolean {
                return true
            }
        })

        return view

    }

}

Pager adapter

class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {

    private var mList : MutableList<ChildFragment> = ArrayList()

    init {
        mList.add(ChildFragment())
        mList.add(ChildFragment())
    }

    fun filter(text: String) {
        mList.forEach {
            it.filter(text)
        }
    }

    override fun getItem(position: Int): Fragment {
        return mList.get(position)
    }

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

}

Child fragment

class ChildFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val view = inflater.inflate(R.layout.child_fragment, container, false)

        // get reference to recyclerview, set adapter...

        return view

    }

    fun filter(text: String) {
        // do job here
    }

}

Upvotes: 2

Related Questions