Search code examples
androidlayoutandroid-viewpager

How to update layout contain after API is been called in PagerAdapter


I have created viewpager layout in which i am passing three different layout which need be update when any API is been called all three any time whether that page is been selected or not.

MainActivity.java

int[] layouts = new int[]{R.layout.one, R.layout.two, R.layout.three};
MyAdapter adapter = new MyAdapter(this, layouts);

MyAdapter.java it is been extends to PagerAdapter

View view = layoutInflator.inflate(mLayouts[position], container, false);
container.addView(view);

How to initialize of all the id of different layout and how I can update the text or layout when API is been called.


Solution

  • Please try this way according to your requirement you can also create 3 childFragment with different layout and add them in list

    class MyFragment : Fragment{
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return super.onCreateView(inflater, container, savedInstanceState)
            initPager()
        }
        
        var fragmentAdapter: PagerAdapter? = null
        fun initPager() {
            fragmentAdapter = PagerAdapter(
                childFragmentManager)
    
            val fragment1 = ChildFragment("1")       
            fragmentAdapter!!.addFragment(fragment1,"title")
    
            val fragment2 = ChildFragment("2")
            fragmentAdapter!!.addFragment(fragment2,"title")
    
            val fragment3 = ChildFragment("3")
            fragmentAdapter!!.addFragment(fragment3,"title")
    
            viewPager.adapter = fragmentAdapter        
            viewPager.offscreenPageLimit = 3
    
            viewPager.addOnPageChangeListener(object :
                ViewPager.OnPageChangeListener {
                override fun onPageScrolled(
                    position: Int,
                    positionOffset: Float,
                    positionOffsetPixels: Int
                ) {
                }
    
                override fun onPageSelected(position: Int) {
                    // do this instead, assuming your adapter reference
                    // is named mAdapter:
                    for (page in childFragmentManager.fragments) {
                        val frag: Fragment = fragmentAdapter!!.getItem(position)
                        if (frag != null && frag is ChildFragment && page is ChildFragment) {
                            page.refresh()
                        }
                    }
                }
    
                override fun onPageScrollStateChanged(state: Int) {}
            })
        }
    }
    
    
    
    class PagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager) {
    
        private val mFragmentList = ArrayList<Fragment>()
        private val mFragmentTitleList = ArrayList<String>()
    
        val activeFragment: List<Fragment>
            get() = mFragmentList
    
        override fun getItem(position: Int): Fragment {
            return mFragmentList[position]
        }
    
        override fun getCount(): Int {
            return mFragmentList.size
        }
    
    
        fun addFragment(fragment: Fragment, title: String) {
            mFragmentList.add(fragment)
            mFragmentTitleList.add(title)
        }
    
        override fun getPageTitle(position: Int): CharSequence? {
            return mFragmentTitleList[position]
        }
    }
    
    
    
    class ChildFragment : Fragment{
    
        var type:String = ""
        constructor(type:String){
            this.type = type
        }
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return super.onCreateView(inflater, container, savedInstanceState)
            if(type.equals("")){
                //TODO LAYOUT LOGIC here according to type validation
            }else{
                //TODO LAYOUT LOGIC here according to type validation
            }
    
            refresh()
        }
        fun refresh() {
           //TODO CALL API and update your layoyt here
    
        }
    }