Как добавить панель загрузки в класс адаптера, где представление находится внутри другого действия

Я пытаюсь добавить loadingbar внутри класса адаптера, где представление того же самого находится внутри основной активности. Я использовал метод doAsync для загрузки приложения при нажатии на значок приложения, который находится внутри основной активности. Ниже приведена ошибка, которую я получаю при использовании панели загрузки внутри метода doAsync.

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Ниже приведен класс адаптера.

Adapter.kt

class Adapter(ctx: Context, private val appInfoList: ArrayList<AppInfoModel>, private val contentResolver: ContentResolver,
              private val packageManager: PackageManager,
              private val loadingIndicator: AVLoadingIndicatorView,
              private val applicationContext: Context) : RecyclerView.Adapter<Adapter.MyViewHolder>()  {
    private val inflater: LayoutInflater

    init {
        inflater = LayoutInflater.from(ctx)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.MyViewHolder {
        val view = inflater.inflate(R.layout.list_item, parent, false)
        return MyViewHolder(view)
    }

    override fun onBindViewHolder(holder: Adapter.MyViewHolder, position: Int) {
        var itemView: View? = null
        holder.appIcon.setImageDrawable(appInfoList[position].appIcon)
        holder.appName.setText(appInfoList[position].appName)
        holder.versionNumber.setText(appInfoList[position].versionNumber)
        if (!appInfoList[position].isInstalled) {
            holder.appInfoCard.foreground = ColorDrawable(Color.parseColor("#CCFFFFFF"))
            holder.appInfoCard.isEnabled = false
            holder.warningIcon.visibility = View.VISIBLE
        }
        holder.appInfoCard.setOnClickListener() {
            Log.e("App opened", appInfoList[position].appName)
            var loadingBar:AVLoadingIndicatorView= loadingIndicator.findViewById(R.id.avi)
            Log.d("Loading bar", loadingBar.toString())
            doAsync {
                try {
                    loadingBar!!.setVisibility(View.VISIBLE);
                    LauncherUtils.setDynamicConfig(contentResolver, packageManager,applicationContext, appInfoList[position].auxName!!, appInfoList[position].packageName!!)
                }
                catch (e: Exception) {
                    Log.e("Exception-launcher", e.toString())
                }
                uiThread {

                    //loadingBar!!.setVisibility(View.INVISIBLE)
                }

            }
        }
    }

Любая помощь будет оценена по достоинству.

Вы не можете коснуться просмотров из фонового потока в Android. Так что переместите loadingBar часть за пределы блока. Вы используете Anko?

ADM 22.05.2019 12:20
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как говорит трассировка стека, вы не должны устанавливать видимость какого-либо представления из фонового потока. Вероятно, перенос loadingBar!!.setVisibility(View.VISIBLE); на uiThread{} решит вашу проблему.

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