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
}