【问题标题】:android-kotlin click Listener not working to replace fragmentandroid-kotlin 单击侦听器无法替换片段
【发布时间】:2018-04-14 03:16:42
【问题描述】:

我创建了一个简单的应用程序来学习如何在 kotlin 中使用片段 和往常一样,如果我创建回收站视图,我必须创建一个新页面来显示项目的详细信息,因此在搜索广告通过在我的适配器中创建接口询问某个答案后,我会在 MainActivity 中覆盖以替换片段的乐趣并在项目 Click 上执行它,我这样做了,但是在我完成点击之后什么都不做,但没有错误 这是我的适配器

class ContentAdapter constructor(private val activity: MainActivity, private var listOfData: ArrayList<MainMarketTickClass>, val listener: ContentListener) : RecyclerView.Adapter<ContentAdapter.ViewHolder>() {

override fun getItemCount(): Int = listOfData.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    var inf = ViewHolder(LayoutInflater.from(parent!!.context).inflate(R.layout.maintick, parent, false))
    return inf

}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bind(listOfData, listener)

}    
inner class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {

    fun bind(listOfData: ArrayList<MainMarketTickClass>, listener: ContentListener) {
        val dataListin2 = listOfData[adapterPosition]

        itemView.textView.text = dataListin2.title


        itemView.MainImage.setOnClickListener {
            listener.onItemClicked(listOfData.get(adapterPosition))
        }
    }
}

 interface ContentListener {
       fun onItemClicked(item: MainMarketTickClass){


      }


}

这里是我的回收站视图片段代码

class MainMarket: Fragment(),ContentAdapter.ContentListener{

var ITEMSList = ArrayList<MainMarketTickClass>()
companion object {
   fun newInstance():Fragment{

       var fb : MainMarket = MainMarket()
       return fb
   }
}


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    var inf = inflater!!.inflate(R.layout.main_marker,container,false)
    return inf


}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    ITEMSList .add ( MainMarketTickClass("123"))
    ITEMSList .add ( MainMarketTickClass(" 123"))
    ITEMSList .add ( MainMarketTickClass("123"))


    var adapter = ContentAdapter (MainActivity(),ITEMSList,this)
    list.adapter = adapter
    list.layoutManager = LinearLayoutManager(this.context,LinearLayoutManager.VERTICAL,false)

}

override fun onItemClicked(item: MainMarketTickClass) {


}

和 MainActivity.kt

class MainActivity : AppCompatActivity(), ContentAdapter.ContentListener {
override fun onItemClicked(item: MainMarketTickClass) {
        var ft1 : FragmentTransaction = supportFragmentManager.beginTransaction()
        ft1.replace(R.id.MainFrame,AddCar.newInstanceaddcar())
        ft1.commit()





}



override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)





    setContentView(R.layout.activity_main)
    var bnv = findViewById(R.id.navigation) as BottomNavigationView
    bnv.setOnNavigationItemSelectedListener (object : BottomNavigationView.OnNavigationItemSelectedListener{
        override fun onNavigationItemSelected(item: MenuItem): Boolean {
            var selectFragment : Fragment? = null
            when (item.itemId) {
                R.id.navigation_home -> {
                    selectFragment = MainMarket.newInstance()
                }
                R.id.navigation_dashboard -> {
                   selectFragment = AddCar.newInstanceaddcar()
                }
                R.id.navigation_notifications -> {

                }
            }
            var ft : FragmentTransaction = supportFragmentManager.beginTransaction()
            ft.replace(R.id.MainFrame,selectFragment)
            ft.commit()

            return true





        }
    })



    var ft : FragmentTransaction = supportFragmentManager.beginTransaction()
    ft.replace(R.id.MainFrame,MainMarket.newInstance())
    ft.commit()
}


}

【问题讨论】:

    标签: android android-fragments kotlin


    【解决方案1】:

    在适配器类中

    itemView.MainImage.setOnClickListener {
                listener.onItemClicked(listOfData.get(adapterPosition))
                acitivity.onItemClicked(listOfData.get(adapterPosition))
            }
    

    或 在片段中,

     var adapter = ContentAdapter (MainActivity(),ITEMSList, <Pass the context of main activity here>)
    

    或 在片段中

    override fun onItemClicked(item: MainMarketTickClass) {
    if(activity is MainActivity){
    (activity as MainActivity).onItemClicked(item)
    }
    
    }
    

    /************/

    在片段中传递数据 在 MainActivity 中

    override fun onItemClicked(item: MainMarketTickClass) {
            var ft1 : FragmentTransaction = supportFragmentManager.beginTransaction()
            ft1.replace(R.id.MainFrame,AddCar.newInstanceaddcar(item.someValue))
            ft1.commit()
    }
    

    在你的片段中

     companion object{
       fun newInstanceaddcar(someValue : String) : AddCar{
             val frag = AddCar()
             val args = Bundle()
             args.putString("key_some_value", someValue);
             frag.arguments = args
             return frag
            }
         }
    

    然后在片段的 onCreate 方法中从参数中获取值并将其放入某个变量中

        arguments?.let{
        someVariableDeclaredInAddCarFrag = it.getString("key_some_value")
    
    }
    

    【讨论】:

    • 谢谢你它与片段中的最后一个一起工作,但另一个问题是如何使用同样的乐趣来传递数据
    • 哪些数据???您已经在侦听器中传递 MainMarketTickClass 类型的数据。在主要活动中,您将获得 MainMarketTickClass 类型。是否要在 AddCar 片段中传递数据??
    • 是的,我希望我尝试发送像“任何东西”这样的字符串和 git null
    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多