我是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)
答案 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对象,则您的类对象应实现Serializable
或Parceable
接口。
这是您的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)
}