如何将项目传递到ViewHolder?

时间:2018-12-20 19:03:58

标签: android kotlin android-adapter kotlin-android-extensions

我是Kotlin的新手,我在开发一款可以兑换货币的应用程序。在适配器中,我想将一些项目传递到新活动中。

 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中是一种不好的做法,我无法在其中启动新活动,因此我在Internet上寻找了解决方案,可以在ViewHolder类中启动新的Activity。但是现在我不知道如何传递被点击进入新活动的项目。

下面是数据类

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

3 个答案:

答案 0 :(得分:1)

Kotlin中的RecyclerView适配器

二手Anko https://github.com/Kotlin/anko

  

Anko是Kotlin库,可以使Android应用程序开发更快,更轻松。它使您的代码干净且易于阅读,并让您无需理会Android SDK for 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)
            }
        }
    }
}

如何在“活动”中获取数据

    data = intent.getStringExtra(COUNTRIES)

请注意,COUNTRIES只是Constants.kt中的键

这是您在Kotlin中的操作方式。     const val HEADER_USER_TYPE =“ userType”

答案 1 :(得分:0)

您可以像这样发送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对象,则您的类对象应实现SerializableParceable接口。

这是您的CountryData类的外观

public class CountryData implements Serializable{
  //  getter and setter

}

如何获取价值?

您可以使用键值获取Class对象。不要忘记打字。

Intent i = getIntent();
CountryData countrydata = (CountryData)i.getSerializableExtra("key");

答案 2 :(得分:-1)

您应该在getAdapterPosition()类中使用ViewHolder来获取用户单击的项目的位置

OR

您还可以将您的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)
}