[Android]解决Viewpager+Fragment布局结构没法刷新Fragment内容

布局结构

首先来建立一个很常见的Viewpager+Fragment的布局。android

Fragment

package com.dubhe.view.fragment

import android.annotation.SuppressLint
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.SimpleTarget
import com.dubhe.view.R
import com.dubhe.view.config.Constant
import com.dubhe.view.mvp.model.ServiceModel
import kotlinx.android.synthetic.main.item.*

class MyFragment : Fragment() {

    companion object {
		//data是传入的数据Model对象
        fun newInstance(data: MyDataModel): MyFragment {
            val args = Bundle()
            args.putSerializable("data", data)
            val fragment = MyFragment()
            fragment.arguments = args
            return fragment
        }
    }

    /** * 刷新数据 */
    fun setData(data: MyDataModel) {
        initView(rootView, data)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// initView(view, imgID)
// rootView = inflater.inflate(R.layout.item_wash_service2, container, false)
        rootView = View.inflate(activity, R.layout.item_wash_service2, null)
        return rootView
    }

    var hindPrice = false
    lateinit var rootView: View
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val data = arguments!!.getSerializable("data") as MyDataModel
        initView(view, data)
    }

    @SuppressLint("SetTextI18n")
    private fun initView(view: View, data: MyDataModel) {
        //TODO:在此处将Model里的数据加载到界面
        //Java要用view.findViewById来取控件
        //Kotlin直接用ID调用就好
}

复制代码

ViewPager设置

private var listDatas: MutableList<MyDataModel> = ArrayList()


listDatas.clear()
listDatas.addAll(model.list)
for (item in listDatas) {
    val position = listDatas.indexOf(item)
    if (position < list.size) {
        //已经存在的项,刷新数据
        val fragment = list[position] as CarWashPageFragment2
        fragment.setData(listDatas[position])
    } else {
        //添加不存在的项
        val fragment = CarWashPageFragment2.newInstance(item)
        list.add(fragment)
    }
}
if (viewPager.adapter == null) {
    viewPager.adapter = object : MyPagerAdapter(supportFragmentManager, list) {
        override fun getItem(i: Int): Fragment {
            return list[i]
        }

        override fun getCount(): Int {
            return list.size
        }
    }
}
viewPager.offscreenPageLimit = list.size//缓存
viewPager.adapter?.notifyDataSetChanged()
复制代码

*破局重点MyPagerAdapter

public abstract class MyPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> pages;

    public MyPagerAdapter(FragmentManager fragmentManager, List<Fragment> pages) {
        super(fragmentManager);
        this.pages = pages;
    }

    @Override
    public Fragment getItem(int index) {
        return pages.get(index);
    }

    @Override
    public int getCount() {
        return pages.size();
    }

    @Override
    public int getItemPosition(Object object) {
        int index = pages.indexOf (object);

        if (index == -1)
            return POSITION_NONE;
        else
            return index;
    }
}
复制代码

原理和解决思路

往后再更_(:з」∠)_缓存

相关文章
相关标签/搜索