Android 使用ViewPager + Fragment 如何偷懒刷新数据

使用场景:
ViewPager + 3个Fragment切换时,需要共享数据,但是如何及时刷新?

首先Fragment的生命周期:
创建:
1.Attach->Created->ActivtiyCreated->Start->Resume
2.Pause->Stop->DestroyView
3.ActivtiyCreated->Start->Resume

现在有3个页面A,B,C,他们有一份数据共享,存放在SharedPreferences中:
首次进入时:FragmentManager会创建两个页面A,B,显示A
Attach->Created->ActivtiyCreated->Start->Resume (A)
Attach->Created->ActivtiyCreated->Start->Resume (B)
当切换到B会创建C
Attach->Created->ActivtiyCreated->Start->Resume (C)
当切换到C,A会被销毁
Pause->Stop->DestroyView (A)
再切换到A,C会被销毁

这样A,C都会走Fragment的完整流程,那么B如何及时的刷新数据:
可以使用Handler、广播,Application共享标记位,好像都不是很合适.....

问题: 我在页面C中关注用户,关注信息保存在SharedPreferences中,现在回到页面B中需要更新展示SharedPreferences当中的数据,如何及时刷新?

解决办法:
观察ViewPager的Adapter和Fragment的生命周期,当ViewPager进行页面切换的时候,Adapter会调用方法 setPrimaryItem,下面是源码:

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment)object;
        if (fragment != mCurrentPrimaryItem) {
            if (mCurrentPrimaryItem != null) {
                mCurrentPrimaryItem.setMenuVisibility(false);
                mCurrentPrimaryItem.setUserVisibleHint(false);
            }
            if (fragment != null) {
                fragment.setMenuVisibility(true);
                fragment.setUserVisibleHint(true);
            }
            mCurrentPrimaryItem = fragment;
        }
    }

该方法会调用Fragment对应的

fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);

即每一次当你切换页面的时候,Adapter会调用页面对应的方法:

fragment.setUserVisibleHint(true);

我们只需要在Fragment的setUserVisibleHint(isVisibleToUser: Boolean) 方法中更新数据即可:

package com.example.hjbapp.page

import android.content.Context
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.example.hjbapp.HJJCApplication
import com.example.hjbapp.R
import com.example.hjbapp.model.RoomFollow
import com.example.hjbapp.util.AllRoomRecyclerViewAdapter
import com.example.hjbapp.util.OnItemClickListener

class AllRoomPager : TestPager(), OnItemClickListener {

    //val TAG: String = "AllRoomPager"
    var mRecyclerView: RecyclerView? = null

    //该数据来自于网络
    val arr = arrayListOf("A6009", "A7001", "A1009", "A3002", "A2002", "A5002", "A2039", "A3302", "A2003", "A7009")
    val arrFollow = arrayListOf() //与本地数据对比后进行初始化

    override fun onAttach(context: Context?) {
        super.onAttach(context)
    }

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

        val view = inflater?.inflate(R.layout.activity_allroom, container, false) as View
        initView(view)

        return view
    }

    private fun initView(v: View) {

        mRecyclerView = v.findViewById(R.id.all_recycleview)

        val ll: LinearLayoutManager = LinearLayoutManager(context)
        ll.orientation = LinearLayout.VERTICAL
        mRecyclerView?.layoutManager = ll

        val mAdapter = AllRoomRecyclerViewAdapter(context, arrFollow)
        mAdapter.setLeftItemClickListener(this)
        mAdapter.setRightItemClickListener(this)
        mRecyclerView?.adapter = mAdapter

    }

    private fun initData() {
        val sp = context.getSharedPreferences(HJJCApplication.SP_FOLLOW_FILENAME, Context.MODE_PRIVATE)
        arrFollow.clear()
        for (roomName in arr) {

            if (sp.contains("${HJJCApplication.SP_FOLLOW_STR_EX}${roomName}")) {
                arrFollow.add(RoomFollow(roomName, true))
            } else {
                arrFollow.add(RoomFollow(roomName, false))
            }
        }
        mRecyclerView?.adapter?.notifyDataSetChanged()

    }

    override fun onItemClick(view: View, position: Int, boolean: Boolean) {

        when (view.id) {

            R.id.all_room_title -> {

                Log.e(TAG, "position >>>>" + position)
                Log.e(TAG, "view.id >>>>" + view.id)
                Log.e(TAG, "id >>>>" + R.id.all_room_title)

            }
            R.id.all_follow_flag -> {

                if (boolean) {
                    followRoom(arr[position])
                } else {
                    cancelFollowRoom(arr[position])
                }


            }
        }
    }

    //保存关注的数据
    private fun followRoom(roomName: String) {
        val sp = context.getSharedPreferences(HJJCApplication.SP_FOLLOW_FILENAME, Context.MODE_PRIVATE)
        val et = sp.edit()
        et.putString("${HJJCApplication.SP_FOLLOW_STR_EX}${roomName}", roomName)
        et.commit()

    }

    //删除
    private fun cancelFollowRoom(roomName: String) {

        val sp = context.getSharedPreferences(HJJCApplication.SP_FOLLOW_FILENAME, Context.MODE_PRIVATE)
        val et = sp.edit()
        et.remove("${HJJCApplication.SP_FOLLOW_STR_EX}${roomName}")
        et.commit()

    }


    override fun onDestroyView() {
        super.onDestroyView()
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
            Log.e(TAG, "-----   setUserVisibleHint     ${javaClass}   ${isVisibleToUser}   -----")
            initData()
        }
    }
}

你可能感兴趣的:(Android 使用ViewPager + Fragment 如何偷懒刷新数据)