Как получить значение переменной от адаптера к действиям в Android Kotlin Recyclelerview? - PullRequest
0 голосов
/ 03 октября 2018

Я создаю приложение чата в Android с использованием kotlin и хотел создать элемент группы на основе зарегистрированных пользователей.

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

Я просматриваю Интернет, но не нашел идеальной статьи об адаптации к активациям.

Пожалуйста, укажите мне некоторые решения / полезные статьи по этому поводу.Или, если этот вопрос продублирован и на него успешно ответили.

Спасибо

AddUserGroupAdapter.kt

....

override fun populateViewHolder(viewHolder: AddUsersGroupAdapter.ViewHolder?, user : Users?, position: Int) {
        var userId = getRef(position).key

        viewHolder!!.bindView(user!!,context)


        viewHolder.itemView.setOnClickListener {
            if(viewHolder.userSelected!!){
                viewHolder.userSelected = false
                //viewHolder!!.bindView(user!!,context)
                viewHolder.userCheck!!.visibility = View.GONE

            }else{
                viewHolder.userSelected = true
                viewHolder.userCheck!!.visibility = View.VISIBLE
            }

            //TODO : I want to collect the Id's into list and 
            // will access to the activity(AddUserGroupActivity)
            //Toast.makeText(context,userId,Toast.LENGTH_LONG).show()

        }


    }

AddUserGroupActivity.kt

...

class AddUsersGroupActivity : AppCompatActivity() {
    var mUserDatabase : DatabaseReference? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_add_users_group)

        supportActionBar!!.setTitle("Add Users in Group")
        supportActionBar!!.setDisplayHomeAsUpEnabled(true)



        var lineaLayoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)

        mUserDatabase = FirebaseDatabase.getInstance().reference
                .child("Users")

        rvAddUsersGroup.setHasFixedSize(true)

        rvAddUsersGroup.layoutManager = lineaLayoutManager
        rvAddUsersGroup.adapter = AddUsersGroupAdapter(mUserDatabase!!, this)

        //TODO : This is where I wanted to have a floating action button onClickListener
        //that will access the variable from adapter and display to toast.
    }
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Добавьте к вам listerner ViewHolder, который уведомит ваш адаптер, и в адаптере перенаправит это уведомление в действие.

override fun populateViewHolder(viewHolder: AddUsersGroupAdapter.ViewHolder?, user : Users?, position: Int, userSelectionListener: (Users, Boolean) -> Unit) {
    var userId = getRef(position).key

    viewHolder!!.bindView(user!!,context)


    viewHolder.itemView.setOnClickListener {
        if(viewHolder.userSelected!!){
            viewHolder.userSelected = false
            //viewHolder!!.bindView(user!!,context)
            viewHolder.userCheck!!.visibility = View.GONE
           usersSelectionListener.invoke(user, true)

        }else{
            viewHolder.userSelected = true
            viewHolder.userCheck!!.visibility = View.VISIBLE
           usersSelectionListener.invoke(user, false)
        }

        //TODO : I want to collect the Id's into list and 
        // will access to the activity(AddUserGroupActivity)
        //Toast.makeText(context,userId,Toast.LENGTH_LONG).show()

    }
}

Добавьте тот же параметр в конструктор адаптера, затем в действии обработайте этот слушатель:

rvAddUsersGroup.adapter = AddUsersGroupAdapter(mUserDatabase!!, this) { user: User, isSelected: Boolean -> 
    //Do want you want with user and selection.
}
0 голосов
/ 03 октября 2018

вы можете передать данные из адаптера в действие тремя способами

  1. добавить CallBack
  2. (context.applicationContext as? BaseActivity)?.doSomething(variable)
  3. с помощью Broadcast

, но если вы можете получить данные из Адаптера по количеству нажатых элементов, используйте

... Интерфейс

interface  OnItemClickListener {
   fun onItemClick(index: Int)
}

... Адаптер

var mOnItemClickListener: OnItemClickListener? = null

... Держатель

 v.setOnClickListener {
            mOnItemClickListener?.onItemClick(adapterPosition)
        }

... Активность

adapter.mOnItemClickListener = object : OnItemClickListener {
        override fun onItemClick(index: Int) {
            mListener?.showDetails(index)
        }

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