Android Kotlin: Как обновить представление списка из другого (третьего) действия - PullRequest
0 голосов
/ 16 марта 2020

Я создаю приложение Android в Kotlin, в котором в главном действии есть кнопка «Добавить игроков», открывающая другое действие. В этом упражнении «Добавить игрока» вы можете вручную добавить игрока, который вызывает третье «всплывающее» действие. Человек вводит информацию, затем нажимает добавить. На этом щелчке я хочу немедленно создать новый объект «Игрок» и обновить представление списка активных игроков по основной деятельности.

Я прочитал, чтобы использовать adapter.notifyDataSetChanged(), но проблема в том, что я могу не найти способ получить ссылку на этот объект адаптера (ArrayAdapter). Если бы это было Java, я бы просто сделал адаптер доступным в глобальном масштабе или опубликовал c stati c, что-то в этом роде. Тем не менее, это Kotlin, где все запутанно для меня. Я не могу сделать адаптер глобально доступным, потому что не могу инициализировать адаптер, потому что параметр context, который каждый передает «this», не работает. Я не могу заставить какую-либо функцию изменить ее на publi c или stati c. Я также не могу латинить переменную, потому что Kotlin почему-то злится на меня.

Я потратил около 2 часов, пытаясь обновить глупый ListView для моего приложения. Это довольно обескураживает, когда я пытаюсь попрактиковаться в создании приложений и попадаюсь на мелочи вроде этого.

Я уверен, что у меня есть серьезное недоразумение, но если кто-то может указать мне правильное направление, это будет будь великим!

Большое спасибо, ребята,

JT

Ответы [ 2 ]

1 голос
/ 16 марта 2020

лучше, если вы используете onActivityResult () Упражнение 3-2 2-1, а затем получаете данные в занятии 1 и добавляете в свой адптер вот так

в адаптере

fun onrefresh(List<>lists){
   this.yourlist=lists   
   notifyDataSetChanged() 
   }

в деятельности

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
  if(requestCode==yourcode){
     if(resultCode.RESULT_OK){

         val data=data.get // you data from here 
        // add this into you list data 
        //than set into adapter
       adapter.onrefresh(yourlist)   

      }
    }      
}
1 голос
/ 16 марта 2020

Не делайте глобальную переменную вашего адаптера / View / ActivityContext, в противном случае вы получите действительно большую проблему с памятью.

Вы должны попытаться использовать Local BroadCast приемник . В Деятельности А, в которой есть Адаптер, вы можете зарегистрировать Local BroadCast receiver в onCreate, чтобы прослушивать любое действие смены адаптера. Вот пример:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("YourAdapaterChangeAction.");

LocalBroadcastManager.getInstance(this).registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, final Intent intent) {
            // check your action with if/else
            //adapter.notify....
        }
},intentFilter);

После этого вы можете просто запустить LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("YourAdapaterChangeAction")); из любого действия для обновления вашего адаптера.

P / s: другой вариант - использовать startActivityForResult.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...