Как передать элементы в ViewHolder? - PullRequest
0 голосов
/ 20 декабря 2018

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

 class AdapterC (val countryList: ArrayList<CountriesData>): RecyclerView.Adapter<AdapterC.ViewHolder>() {

    override fun onCreateViewHolder(view: ViewGroup, position: Int): ViewHolder {

         val v = LayoutInflater.from(view?.context).inflate(R.layout.country_list,view,false)
         return  ViewHolder(v)
    }

    override fun getItemCount(): Int {
         return countryList.size
    }

    override fun onBindViewHolder(view: ViewHolder, position: Int) {

          val country : CountriesData=countryList.toTypedArray()[position]
          view?.textViewName.text=country.name

            /*
             Old code in which i can accese to items        
             view.itemView.setOnClickListener{
             var name = country.name
             var id = country.id
             }
            */

     }


     class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){

           val textViewName= itemView.findViewById(R.id.TextViewCountry) as TextView

         //New code that i found on the internet

           init {

                  itemView.setOnClickListener{

                      val intent = Intent(itemView.context, CurrencyActivity::class.java)
                      itemView.context.startActivity(intent)

                   }
            }
      }

  }

Поскольку я знаю, что это плохая практика - помещать setOnClickListener внутри onBindViewHolder, и я не смог запустить новое действие там, поэтомуЯ посмотрел в Интернете, и было решение начать новую активность внутри класса ViewHolder.Но теперь я не знаю, как передать элемент, который был добавлен в новое действие.

Ниже приведен класс данных

data class CountriesData(val name :String,val id :String)

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Вы можете отправить CountriesData следующим образом

Вот как я делаю в Java

 @Override
 public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int index) 
  {

    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            CountriesData countryData = countryList.get(index);
            Intent intent= new Intent(context, NewActivity.class);
            intent.putExtra("key", countryData );
            context.startActivity(intent);
        }
 }

Примечание

Если вы передаете объект Class, тогда ваш классобъект должен реализовывать интерфейс Serializable или Parceable.

Вот так должен выглядеть ваш класс CountryData

public class CountryData implements Serializable{
  //  getter and setter

}

Как получить значение?

Вы можете получить объект Class, используя значение ключа.Не забудьте Typecast.

Intent i = getIntent();
CountryData countrydata = (CountryData)i.getSerializableExtra("key");
0 голосов
/ 21 декабря 2018

Адаптер RecyclerView в Kotlin

Используется Anko https://github.com/Kotlin/anko

Anko - это библиотека Kotlin, которая делает разработку приложений для Android быстрее и проще.Он делает ваш код чистым и легким для чтения, а также позволяет забыть о неровностях Android SDK для Java.

class StackAdapter(val context: Context, val countryList: ArrayList<CountriesData>) : RecyclerView.Adapter<StackAdapter.StackViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StackViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
        return StackViewHolder(view)
    }

    override fun getItemCount(): Int = countryList.size

    override fun onBindViewHolder(holder: StackViewHolder, position: Int) {
            holder.setUpViewHolder(countryList[position])
    }

    inner class StackViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val Name: TextView = itemView.txtView

        fun setUpViewHolder(countries: CountriesData){
            Name.text = countries.name
            Name.setOnClickListener {
                context.startActivity<CurrencyActivity>(COUNTRIES to countries)
            }
        }
    }
}

Как получить данные в Activity

    data = intent.getStringExtra(COUNTRIES)

Примечание СТРАНЫ - это просто ключ к Constants.kt

Вот как вы это делаете в Kotlin.const val HEADER_USER_TYPE = "userType"

0 голосов
/ 21 декабря 2018

Вы должны использовать getAdapterPosition() внутри вашего ViewHolder класса, чтобы получить позицию нажатого элемента пользователем

ИЛИ

Вы также можете поместить свой onClick код до onCreateViewHolder() и затем используйте

vh = ViewHolder(v)
vh.textViewName.setOnClickListener {
//Your code to start activity
val intent = Intent(itemView.context, CurrencyActivity::class.java)
val bundle = Bundle()
bundle.putString("name", name)
bundle.putString("id", id)
intent.putExtras(bundle)
itemView.context.startActivity(intent)
}
...