Обновить фрагмент внутри ViewPager при повторном выборе вкладки - PullRequest
0 голосов
/ 03 мая 2019

Этот вопрос задавался много, но в каждом решении я не могу найти хороший способ его реализовать.

В основном у меня есть FragmentPagerAdaper

internal class FragmentPagerAdapter(fm: androidx.fragment.app.FragmentManager, private val mNumbOfTabs: Int) : androidx.fragment.app.FragmentStatePagerAdapter(fm) {
     override fun getItem(position: Int): Fragment {
         return when (position) {
             HOME -> HomeFragment()
             SHOPPING_CART -> ShoppingCartFragment()
             /*COLLECTION -> CollectionFragment()
             USER_SETTINGS -> UserSettingsFragment()*/
             else -> HomeFragment()
         }
     }

    override fun getCount(): Int {
        return mNumbOfTabs
    }

    companion object {
        private const val HOME = 0
        private const val SHOPPING_CART = 1
        private val COLLECTION = 1
        private val USER_SETTINGS = 2
    }
}

и ShoppingCartFragment

class ShoppingCartFragment : Fragment() {

    private var inputFragmentView: View? = null
    var products: ArrayList<Any> = ArrayList()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val frameLayout = FrameLayout(this.context!!)
        populateViewForOrientation(inflater,frameLayout)
        return frameLayout
    }

    private fun RecyclerAnimator(recyclerView: RecyclerView, adapter: ProductCartViewAdapter) {
        val itemAnimator = DefaultItemAnimator()
        itemAnimator.addDuration = 1000
        itemAnimator.removeDuration = 1000
        recyclerView.itemAnimator = itemAnimator
        recyclerView.adapter = adapter
        recyclerView.layoutManager = LinearLayoutManager(context)
        val divider = requireContext().resources.getDimensionPixelSize(R.dimen.divider_size_default)
        recyclerView.addItemDecoration(DividerItemDecorator(divider, SPACE_BOTTOM))//SPACE_LEFT or SPACE_TOP or SPACE_RIGHT or SPACE_BOTTOM concat
    }

    fun checkList(){
        products.clear()
        products = database.retrieveShoppingCartList()
        val emptyImage = inputFragmentView!!.findViewById<ImageView>(R.id.emptyList)
        val recyclerList = inputFragmentView!!.findViewById<RecyclerView>(R.id.shopping_rv)

        if (products.isEmpty() || products.size == 0){
            recyclerList.visibility = GONE
            recyclerList.removeAllViews()
            emptyImage.visibility = VISIBLE
        } else{
            recyclerList.visibility = VISIBLE
            emptyImage.visibility = GONE

            val adapter = ProductCartViewAdapter(products, context!!, this)
            RecyclerAnimator(recyclerList, adapter)
        }
    }

    private fun populateViewForOrientation(inflater: LayoutInflater, viewGroup: ViewGroup) {
        viewGroup.removeAllViewsInLayout()
        inputFragmentView = inflater.inflate(R.layout.fragment_shopping_cart, viewGroup)
        checkList()
    }
}

пока здесь все идет хорошо. Так выглядит приложение.

App Tab

Но когда я выбираю ту вкладку, которая содержит ShoppingCartFragment , мне нужно обновить список. чтобы быть более конкретным, вызовите функцию FragmentPagerAdapter.checkList () .

Но каждый раз, когда я пытаюсь вызвать эту функцию из фрагмента, я продолжаю получать NullPointer из-за контекста фрагмента, который не может быть найден ... в этом:

products = database.retrieveShoppingCartList ()

и вот как я справляюсь с этим контекстом, используя синхронизатор в getInstance

SQLiteHandler

private var instance: SQLiteHandler? = null

@Synchronized
    fun getInstance(ctx: Context): SQLiteHandler {
        if (instance == null) {
            instance = SQLiteHandler(ctx.applicationContext)
        }
        return instance!!
    }

// Access property for Context
val Context.database: SQLiteHandler
    get() = SQLiteHandler.getInstance(applicationContext)

val androidx.fragment.app.Fragment.database: SQLiteHandler
    get() = SQLiteHandler.getInstance(activity!!.applicationContext)

Или каким-либо другим способом воссоздать фрагмент окна просмотра при повторном выборе вкладки

...