簡體   English   中英

Kotlin Android-從Fragment中的AsyncTask更新UI

[英]Kotlin Android - Update UI from AsyncTask in Fragment

我有一個與AsyncTask()的片段。 AsyncTask()SharedPreferences加載數據,然后將其放入ArrayAdapter

問題是,此ArrayAdapter應該用於ListView ,但是從AsyncTask()類中,我無法與UI交互,因為我應該使用LayoutInflater來進行此操作,並且我的展開式布局是從函數OnCreateView返回的,因此我無法將其傳遞給AsyncTask()

我嘗試將布局直接AsyncTask()AsyncTask()並可以使用,但是我無法單擊ListView項。

也嘗試過

 if(AsyncTask.status == Status.FINISHED){
   //my code
}

但什么也沒發生。

這是我的OnCreateView()

override fun onCreateView(


      inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {

        val mainView = inflater.inflate(R.layout.fragment_email, container, false)

        MyAsyncTask().execute()

        if(MyAsyncTask().status == Status.FINISHED){
            mainView.email_listView.adapter = adapter

            adapter.notifyDataSetChanged()

            if(adapter.isEmpty)
                mainView.email_blank_textView.text = resources.getString(R.string.noEmail)

            mainView.email_listView.setOnItemClickListener { adapterView, _, i,  l ->
                viewEmailAlertDialog(adapterView, i, adapter)
           }

        }

這是我的AsyncTask()

inner class MyAsyncTask : AsyncTask<Unit, Unit, String>(){
    override fun doInBackground(vararg params: Unit): String {
        loadData()
        loadDataCount()

        return "FINISHED"
    }
    override fun onPostExecute(result: String) {
        if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES)
            adapter = ArrayAdapter(activity!!.applicationContext, R.layout.listview_text_dark, emailAddresses)
        else
            adapter = ArrayAdapter(activity!!.applicationContext, R.layout.listview_text_light, emailAddresses)

        adapter.notifyDataSetChanged()
    }
}


    return mainView
}

您在執行可能尚未開始工作的異步之后if(MyAsyncTask().status == Status.FINISHED)調用if(MyAsyncTask().status == Status.FINISHED)

您可以在oncreate中將空列表提供給適配器,並在列表視圖中將setonclicklistener提供給listview(刪除異步==完成的邏輯),然后只需更新該列表並在后執行時調用adapter.notifyDataSetChanged,

但是,我同意@Pawel的意見,即您應該使用協程,請參閱我的問題:

科特琳·協程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM