【问题标题】:How to pass items into ViewHolder?如何将项目传递到 ViewHolder?
【发布时间】:2019-01-16 14:04:27
【问题描述】:

我是 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 类中启动新活动的解决方案。但是现在我不知道如何传递一个被点击进入新活动的项目。

下面是数据类

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

【问题讨论】:

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


【解决方案1】:

Kotlin 中的 RecyclerView 适配器

二手安科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)
            }
        }
    }
}

如何在Activity中获取数据

    data = intent.getStringExtra(COUNTRIES)

注意 COUNTRIES 只是 Constants.kt 中的一个键

这就是你在 Kotlin 中的做法。 const val HEADER_USER_TYPE = "userType"

【讨论】:

    【解决方案2】:

    您可以像这样发送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 对象,那么您的 class 对象应该实现 SerializableParceableinterface。

    这就是你的CountryData 类的样子

    public class CountryData implements Serializable{
      //  getter and setter
    
    }
    

    如何获取价值?

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

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

    【讨论】:

      【解决方案3】:

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

      你也可以把你的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)
      }
      

      【讨论】:

        猜你喜欢
        • 2016-02-02
        • 2016-07-18
        • 1970-01-01
        • 2019-04-08
        • 2016-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        相关资源
        最近更新 更多