Android 如何在片段中添加RecyclerView?

Android 如何在片段中添加RecyclerView?,android,kotlin,android-fragments,android-recyclerview,Android,Kotlin,Android Fragments,Android Recyclerview,目前,我正在尝试在片段内部实现回收视图,但我找不到显示它的方法 这是我的main活动: package com.example import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import com.example.projectdrivemark.R import com.

目前,我正在尝试在
片段
内部实现
回收视图
,但我找不到显示它的方法

这是我的
main活动

package com.example

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.example.projectdrivemark.R
import com.example.projectdrivemark.databinding.ActivityMainBinding
import com.example.recyclerView.MockDatabase.Companion.createMockData
import com.example.recyclerView.PostAdapter
import com.example.recyclerView.RecyclerViewFragment
import com.example.tempConverter.TempConverterFragment
import com.example.uploaderView.UploaderFragment

class MainActivity : AppCompatActivity(), PostAdapter.OnPostClickListener {
    private lateinit var binding: ActivityMainBinding
    val dummyList = createMockData()
    val adapter = PostAdapter(dummyList, this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        title = "First Kotlin App"
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val recyclerView = RecyclerViewFragment()
        val tempConverterView = TempConverterFragment()
//        recyclerView.layoutManager = LinearLayoutManager(this)
        val uploaderView = UploaderFragment(this)
        setFragmentView(recyclerView)

        binding.bottomNavBar.setOnNavigationItemSelectedListener {
            when(it.itemId){
                R.id.listView ->  setFragmentView(recyclerView)
                R.id.tempConverterView -> setFragmentView(tempConverterView)
                R.id.videoUploaderView -> setFragmentView(uploaderView)
            }
            true
        }
    }

    private fun setFragmentView(fragment: Fragment){
        supportFragmentManager.beginTransaction().apply {
            replace(R.id.main_fragment_view, fragment)
            //Will return to previous page when tap "Back Button" on the phone
            addToBackStack(null)
            commit()
        }
    }

    override fun onEditPost(position: Int){
        val clickedPost = dummyList[position]
        clickedPost.title = "Updated title"
        clickedPost.body = "Updated body"
        adapter.notifyItemChanged(position)
    }

    override fun onDeletePost(position: Int) {
        dummyList.removeAt(position)
        adapter.notifyItemRemoved(position)
    }

    fun celsiusFunction(view: View) {
        val tempConverter = TempConverterFragment()
        tempConverter.celsiusFunction(view)
    }

    fun farenheitFunction(view: View){
       val fahrenheitConverter = TempConverterFragment()
        fahrenheitConverter.farenheitFunction(view)
    }
}
这是我的
回收碎片

package com.example.recyclerView

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.MainActivity
import com.example.projectdrivemark.R

class RecyclerViewFragment: Fragment() {
    var adapter: RecyclerView.Adapter<PostAdapter.PostViewHolder>? = null
    var layoutManager: RecyclerView.LayoutManager? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        super.onCreate(savedInstanceState)
        val binding = inflater.inflate(R.layout.fragment_list, container, false)
        return binding
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        view.apply{
            layoutManager = LinearLayoutManager(activity)
            adapter = PostAdapter(dummyData = ArrayList<Post>(), MainActivity())
        }
    }
}
如果有人看到我遗漏了什么,请告诉我,因为我一直在想如何显示
RecyclerView
。任何帮助都将不胜感激

编辑:

这是我的
MockDatabase

package com.example.recyclerView

import com.example.projectdrivemark.R

class MockDatabase {
    companion object{
        fun createMockData(): ArrayList<Post>{
            val list = ArrayList<Post>()
            for(i in 0 until 20){
                val imageToSelect = when (i % 3){
                    0 -> R.drawable.ic_baseline_account_balance
                    1 -> R.drawable.ic_baseline_account_circle
                    2 ->R.drawable.ic_baseline_ac_unit
                    else -> R.drawable.ic_baseline_access_alarms
                }
                list.add(
                        Post(
                            imageToSelect,
                            title = "Title post of $i",
                            body = "Title post of $i"
                        )
                )
            }
            return list
        }
    }
}

传递空的
dummyData
很简单,请尝试改用
createMockData()
。同样,作为Android中的一条经验法则,永远不要自己启动一个活动,如果需要片段中的引用,可以使用
getActivity()
方法。因此:

adapter=PostAdapter(dummyData=ArrayList(),MainActivity())

应该是:


adapter=PostAdapter(dummyData=createMockData(),getActivity()作为MainActivity)
传递空的
dummyData
很简单,请尝试改用
createMockData()
。同样,作为Android中的一条经验法则,永远不要自己启动一个活动,如果需要片段中的引用,可以使用
getActivity()
方法。因此:

adapter=PostAdapter(dummyData=ArrayList(),MainActivity())

应该是:


adapter=PostAdapter(dummyData=createMockData(),getActivity()作为MainActivity)
您需要将
视图
强制转换为
回收视图
才能访问应用程序中的
回收视图
属性,并且您不能自己创建
活动
的实例,
MainActivity()
错误且不起作用,请改用
requireActivity()
,它将提供附加到
片段的
活动的上下文

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    view.findViewbyId<RecyclerView>(R.id.recycleViewMain).apply{
        layoutManager = LinearLayoutManager(requireActivity())
        adapter = PostAdapter(dummyData = ArrayList<Post>(), requireActivity() as OnPostClickListener)
    }
}
适配器

class PostAdapter(val dummyData: ArrayList<Post>, val myListener: OnPostClickListener) : RecyclerView.Adapter<PostAdapter.PostViewHolder>(){
   // you can use myListener to call methods
}
class PostAdapter(val-dummyData:ArrayList,val-myListener:OnPostClickListener):RecyclerView.Adapter(){
//您可以使用myListener调用方法
}

您需要将
视图
强制转换为
回收视图
才能访问应用中的
回收视图
属性,而且您不能自己创建
活动的实例
MainActivity()
错误且不起作用,请改用
requireActivity()
,它将提供附加到
片段的
活动的上下文

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    view.findViewbyId<RecyclerView>(R.id.recycleViewMain).apply{
        layoutManager = LinearLayoutManager(requireActivity())
        adapter = PostAdapter(dummyData = ArrayList<Post>(), requireActivity() as OnPostClickListener)
    }
}
适配器

class PostAdapter(val dummyData: ArrayList<Post>, val myListener: OnPostClickListener) : RecyclerView.Adapter<PostAdapter.PostViewHolder>(){
   // you can use myListener to call methods
}
class PostAdapter(val-dummyData:ArrayList,val-myListener:OnPostClickListener):RecyclerView.Adapter(){
//您可以使用myListener调用方法
}

如果RecyclerView根和
片段列表中的唯一元素
?对不起,我不明白。我还是kotlin的新手。请粘贴您的片段\u list.xml,也可以发布您的xml吗?我猜回收者视图只是一个布局,而不是字面上的回收者视图。我没有在科特林工作过。但其中一个程序是。1.在布局中添加回收器视图。给它一个身份证。现在在java类中,使用findviewbyid初始化该视图。然后创建一个适配器,通过布局管理器,然后设置适配器。@sonu kumar prashant。好的,我现在明白你从答案中初始化视图的意思了。我看到了我的错误。感谢您告诉我RecyclerView根目录和
片段列表中唯一的元素的过程
?对不起,我不明白。我还是kotlin的新手。请粘贴您的片段\u list.xml,也可以发布您的xml吗?我猜回收者视图只是一个布局,而不是字面上的回收者视图。我没有在科特林工作过。但其中一个程序是。1.在布局中添加回收器视图。给它一个身份证。现在在java类中,使用findviewbyid初始化该视图。然后创建一个适配器,通过布局管理器,然后设置适配器。@sonu kumar prashant。好的,我现在明白你从答案中初始化视图的意思了。我看到了我的错误。谢谢你告诉我程序,我已经更新了帖子,并遵循了这两个答案。当我cas view as RecyclerView时,它会给我一个错误,即它不能转换为该类型。然后,我在参数中添加了模拟数据,但它说适配器没有连接。更新了答案以获得
RecyclerView
的参考,它工作了。但我想问,正如你们在我的主要活动中看到的,我有两个属于recyclerView的函数。一个是EditPost和DeletePost函数。如何在RecyclerView片段中调用它们?我已经更新了帖子,并遵循了这两个答案。当我cas view as RecyclerView时,它会给我一个错误,即它不能转换为该类型。然后,我在参数中添加了模拟数据,但它说适配器没有连接。更新了答案以获得
RecyclerView
的参考,它工作了。但我想问,正如你们在我的主要活动中看到的,我有两个属于recyclerView的函数。一个是EditPost和DeletePost函数。如何在RecyclerView片段中调用它们?
class PostAdapter(val dummyData: ArrayList<Post>, val myListener: OnPostClickListener) : RecyclerView.Adapter<PostAdapter.PostViewHolder>(){
   // you can use myListener to call methods
}