美文网首页
Android 使用ViewPager + Fragment 如

Android 使用ViewPager + Fragment 如

作者: Lost_Robot | 来源:发表于2017-10-10 14:34 被阅读152次

    使用场景:
    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<String>("A6009", "A7001", "A1009", "A3002", "A2002", "A5002", "A2039", "A3302", "A2003", "A7009")
        val arrFollow = arrayListOf<RoomFollow>() //与本地数据对比后进行初始化
    
        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 如

          本文链接:https://www.haomeiwen.com/subject/frmvyxtx.html