AsyncTaskLoader возвращает старые значения вместо новых

У меня есть следующая проблема. Мое приложение содержит два фрагмента (FragmentA, FragmentB), размещенных в одном действии. Я пытаюсь получить данные из URL-адреса и отобразить их во фрагменте A в окне повторного использования. Я также реализовал AsyntaskLoader во FragmentA для извлечения данных из URL

Проблема в том, что я пытаюсь реализовать кнопку обновления, которая будет загружать новые данные из URL, но она всегда возвращает данные, которые уже были загружены. Данные обновляются только тогда, когда я перехожу к фрагменту B а затем обратно к фрагменту A.

ЭТО МОЙ ПОГРУЗЧИК

Класс EventLoader(context: Context, приватный val url: String?, приватный val httpRequestBuilder: HttpRequestBuilder): AsyncTaskLoader> (context) {

override fun loadInBackground(): ArrayList<Event>? {

    return url?.let { httpRequestBuilder.fetchCountlyData(it) }
}

override fun onStartLoading() {
    forceLoad()
}

}

ЭТО МОЙ ФРАГМЕНТ

class EventFragment : Fragment(), LoaderManager.LoaderCallbacks<ArrayList<Event>> {

private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: RecyclerView.Adapter<*>
private var viewManager = LinearLayoutManager(activity)
private lateinit var stateText: TextView
private lateinit var loadingIndicator: ProgressBar
private lateinit var refreshIcon: ImageButton
private var initList = arrayListOf<Event>()
private val url = "https://appanalytics-test.wirecard.com/o?method=user_details&uid=b37ed2fcb1647fd94fa3a835b9c34ed0c52c7438&api_key=15fc695e630e404206b5ce7db37d3029&app_id=5b153d2d0b2f2605440f8a5f"
private val httpRequestBuilder = HttpRequestBuilder()

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

    val view = inflater.inflate(R.layout.fragment_event, container, false)
    refreshIcon = activity!!.findViewById(R.id.refresh_toolbar_button)
    stateText = view.findViewById(R.id.empty_view)
    viewAdapter = ItemAdapter(initList, activity!!.baseContext)
    loadingIndicator = view.findViewById(R.id.loading_indicator)

    val connectManager = activity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo = connectManager.activeNetworkInfo

    if (networkInfo != null && networkInfo.isConnected) {
        loaderManager.initLoader(1, null, this as LoaderManager.LoaderCallbacks<ArrayList<Event>>)
    } else {
        loadingIndicator.visibility = View.GONE
        stateText.text = getString(R.string.no_internet)
    }

    refreshIcon.setOnClickListener {
        loaderManager.restartLoader(1, null, this as LoaderManager.LoaderCallbacks<ArrayList<Event>>)
    }

    implementRecyclerView(view)

    return view
}

override fun onCreateLoader(id: Int, args: Bundle?): Loader<ArrayList<Event>> {
    initList.clear()
    viewAdapter.notifyDataSetChanged()
    loadingIndicator.visibility = View.VISIBLE
    stateText.visibility = View.GONE

    return EventLoader(context!!, url, httpRequestBuilder)
}

override fun onLoadFinished(loader: Loader<ArrayList<Event>>, events: ArrayList<Event>?) {
    stateText.text = getString(R.string.empty_list)
    loadingIndicator.visibility = View.GONE

    if (events != null && !events.isEmpty()) {
        initList.addAll(events)
        viewAdapter.notifyDataSetChanged()
        stateText.visibility = View.GONE
    } else {
        stateText.visibility = View.VISIBLE
    }
}

override fun onLoaderReset(loader: Loader<ArrayList<Event>>) {

}

private fun implementRecyclerView(view: View) {
    recyclerView = view.findViewById<RecyclerView>(R.id.recycler_view).apply {
        layoutManager = viewManager
        adapter = viewAdapter
    }
}

}

0 ответов

Другие вопросы по тегам