我在片段中有回收站视图。当我单击recyclerview中的一项时,我想打开新片段。我必须在适配器的列中看到图片:我还创建了两个片段(fragment_opel和fragment chevrolet。)当用户单击雪佛兰行时,fragment_chevrolet必须打开。我是android studio的新手。在我的适配器中创建onclick方法。但是我不能填补那个职能。 :)您能帮我吗?
我的适配器:
package com.example.parcaburada
class AracMarkaAdapter(tumKategori: ArrayList<AracMarka>) :
RecyclerView.Adapter<AracMarkaAdapter.AracMarkaViewHolder>() {
var araclar = tumKategori
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracMarkaViewHolder {
var inflater = LayoutInflater.from(parent.context)
var arackategori = inflater.inflate(R.layout.arac_kategori, parent, false)
return AracMarkaViewHolder(arackategori)
}
override fun getItemCount(): Int {
return araclar.size
}
override fun onBindViewHolder(holder: AracMarkaViewHolder, position: Int) {
holder.aracismi.text = araclar.get(position).aracAdi
holder.aracLogo.setImageResource(araclar.get(position).aracLogo)
}
class AracMarkaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
override fun onClick(v: View?) {
}
var teksatirKategori = itemView
var aracismi = teksatirKategori.tvaracAdi
var aracLogo = teksatirKategori.img_arac_sembol
}
}
我的片段:
package com.example.parcaburada.ui.kategori
class KategoriFragment : Fragment() {
var araclarKategori = ArrayList<AracMarka>()
private lateinit var galleryViewModel: GalleryViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
veriKaynaginiDoldur()
galleryViewModel =
ViewModelProviders.of(this).get(GalleryViewModel::class.java)
var root = inflater.inflate(R.layout.fragment_category, container, false)
var rvarackategori = root.findViewById(R.id.rvarackategori) as RecyclerView
var MyAdapter = AracMarkaAdapter(araclarKategori)
rvarackategori.adapter = MyAdapter
var linearLayoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
rvarackategori.layoutManager = linearLayoutManager
return root
}
fun veriKaynaginiDoldur(): ArrayList<AracMarka> {
var aracLogo = arrayOf(R.drawable.opellogo, R.drawable.chevroletlogo)
var aracismi = resources.getStringArray(R.array.arabaisim)
for (i in 0 until min(aracismi.size, aracLogo.size)) {
var eklenecekaracKategori = AracMarka(aracismi[i], aracLogo[i])
araclarKategori.add(eklenecekaracKategori)
}
return araclarKategori
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
}
}
答案 0 :(得分:1)
在ViewHolder
对象上设置一个点击侦听器。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracMarkaViewHolder {
var inflater = LayoutInflater.from(parent.context)
var arackategori = inflater.inflate(R.layout.arac_kategori, parent, false)
return AracMarkaViewHolder(arackategori).also {
arackategori.setOnClickListener { clickHandler.forwardClick(it) }
}
}
我们设置了一个侦听器,在其中调用函数forwardClick(holder: AracMarkaViewHolder)
。我们将当前的膨胀视图持有者引用传递给它,以便将来可以对其进行任何操作。
我们创建一个界面是因为我们希望该活动处理任何单击事件。就您而言,这些事件包括启动一个新片段。
interface ClickEventHandler {
fun forwardClick(holder: AracMarkaViewHolder)
}
现在在您的适配器中,按如下所示设置界面:
private val clickHandler: ClickEventHandler = context as ClickEventHandler
现在,我们需要稍微修改适配器的构造函数。
var MyAdapter = AracMarkaAdapter(araclarKategori, requireContext()) //We pass the activity's context.
您的适配器类签名应如下所示:
class AracMarkaAdapter(tumKategori: ArrayList<AracMarka>, context: Context) :
RecyclerView.Adapter<AracMarkaAdapter.AracMarkaViewHolder>() {
private val clickHandler: ClickEventHandler = context as ClickEventHandler
}
现在,我们在活动中实现该接口。
class MainActivity : AppCompatActivity(), ClickEventHandler {
override fun forwardClick(holder: AracMarkaViewHolder) {
//Launch a new fragment here.
}
}
答案 1 :(得分:1)
只需像这样在您的onBindViewHolder
方法中实现“开始分段”-
override fun onBindViewHolder(holder: AracMarkaViewHolder, position: Int) {
holder.aracismi.text = araclar.get(position).aracAdi
holder.aracLogo.setImageResource(araclar.get(position).aracLogo)
holder.setOnClickListener {
if (position == 0) {
TODO("Go to first fragment")
} else {
TODO("Go to second fragment")
}
}
}
答案 2 :(得分:1)
以防万一,这可以帮助使用Kotlin和Android Studio 4的任何人。
我正在片段中的RecycleView上使用适配器。如果要显示新的片段视图,则只能在mainactivity.kt类而不是适配器类中进行重写,因为它不在主线程上。
因此我在适配器中用于recyclerview的构造函数更改为:
class MyFollowRecyclerViewAdapter(
private val values: List<FollowItem>,
private val context: Context
)
然后我的适配器类中有一个变量:
private val clickHandler: ClickEventHandler = context as ClickEventHandler
然后,我将适配器类中的setOnClickListener添加到onCreateViewHolder方法中:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(layout.fragment_item_follow, parent, false)
view.setOnClickListener {
clickHandler.viewFollow(it)
}
return ViewHolder(view)
}
ClickEventHandler在我的适配器类中定义为:
interface ClickEventHandler {
fun viewFollow(holder: View)
}
现在用于mainactivity中该函数的ovverride。我将ClickEventListener添加到MainActivity类中:
class MainActivity : AppCompatActivity(), ClickEventHandler {
然后我在mainactivity类中的适配器类中创建我的函数的覆盖函数:
override fun viewFollow(holder: View) {
}
答案 3 :(得分:0)
您需要为适配器实现onClickListener接口。 之后,您可以设置您的recyclerview可见性消失,并且frameLayout可见。 现在将所需的片段发送到frameLayout中。
OR
主要活动中的实现适配器onClickListener并通过选定的recyclerview项目索引显示所需的片段