Atul Dhanuka
Atul Dhanuka

Reputation: 1463

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.

Upvotes: 0

Views: 49

Answers (1)

gpuser
gpuser

Reputation: 1183

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

    }
}

Upvotes: 1

Related Questions