![](/img/trans.png)
[英]Android Fragment Update TextView From AsyncTask onPostExecute
[英]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.