【问题标题】:kotlin-cant replace Fragment from RecyclerView adapterkotlin-cant 从 RecyclerView 适配器替换 Fragment
【发布时间】:2018-04-12 17:20:14
【问题描述】:

点击后应用程序终止 而且我不知道我必须在哪里输入在适配器或 RecyclerView 的片段 Mainadapter.kt

class ContentAdapter(
    private val activity: MainActivity, 
    private var listOfData: ArrayList<MainMarketTickClass>
) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener {
    override fun onClick(v: View?) {
        val manager = activity.supportFragmentManager
        val transaction = manager.beginTransaction()
        val trs = AddCar()
        transaction.add(android.R.id.content, trs, "IndividualBook")
        transaction.addToBackStack(null)
        transaction.commit()
        var heroActivity: MainActivity = activity

    }

    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)
        holder.itemView.MainImage.setOnClickListener(this)
    }

    class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
        fun bind(listOfData: ArrayList<MainMarketTickClass>) {
            val dataListin2 = listOfData[adapterPosition]
            itemView.textView.text = dataListin2.title
        }
    }

RecyclerView 片段

class MainMarket : Fragment() {
    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)
        list.adapter = adapter
        list.layoutManager = LinearLayoutManager(this.context, LinearLayoutManager.VERTICAL, false)
    }
}

我在 OnClick 有趣的 FATAL EXCEPTION 中遇到了一些错误

【问题讨论】:

    标签: android android-fragments kotlin


    【解决方案1】:

    我建议您使用与适配器中的点击侦听器事务不同的方法。

    这是Adapter

    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)
        }
    
        class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
    
            fun bind(listOfData: ArrayList<MainMarketTickClass>, listener: ContentListener) {
                val dataListin2 = listOfData[adapterPosition]
    
                itemView.textView.text = dataListin2.title
    
                // this is the click listener. It calls the onItemClicked interface method implemented in the Activity
                itemView.setOnClickListener {
                    listener.onItemClicked(listOfData.get(adapterPosition))
                }
            }
        }
    
        public interface ContentListener {
            fun onItemClicked(item: MainMarketTickClass)
        }
    
    }
    

    这是MainActivity

    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)
        list.adapter = adapter
        list.layoutManager = LinearLayoutManager(this.context,LinearLayoutManager.VERTICAL,false)
    
    }
    
    override onItemClicked(item: MainMarketTickClass) {
    // this method gets executed everytime an item gets clicked. You should 
    // delegate the fragment transactions to the activity that hosts the fragment. 
    // You should not do a fragment transaction from inside the fragment.
    // You can use a similar interface approach to contact the activity from the Fragment.
    
    }
    

    【讨论】:

    • 非常感谢,对不起,我只是初学者,我正在尝试您的代码,我想我明白了您的意思 1-我必须从 mainActivity 覆盖 onItemClicked 对吗?
    • 2-当我尝试时出现两个错误参数监听器的值传递我应该传递什么?
    • 没有。由于Fragment 中有Adapter,因此您需要在Fragment 中实现监听器,并且您将覆盖Fragment 中的onItemCliked 方法。但是你不应该从Fragment 做FragmentTransaction。因此,您应该再次使用相同的侦听器模式来执行 Activity 文件中应该执行 FragmentTransactions 的方法
    • 如果你不能覆盖片段中的onItemClicked,可能是因为你需要从片段中实现ContentAdapter.ContentListener。因此,您所要做的就是在Fragment 类的第一行中的Fragment() 之后放置一个,,然后输入ContentAdapter.ContentListener,这是适配器中接口的名称。如果更改适配器的名称,则需要相应更改实现
    • 好的,我已经完成了一部分,但我不知道我应该传递给参数侦听器的内容以及如何在 Activity 中实现 ContentAdapter.ContentListener ?
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2021-12-26
    • 1970-01-01
    • 2016-10-03
    相关资源
    最近更新 更多