【发布时间】:2021-04-14 13:28:16
【问题描述】:
当我的应用程序启动时,我调用一个使用 retrofit/gson 的函数并调用一个 rest API,然后从那里将数据发送到适配器并放置在回收器视图中。我遇到的问题是,当我导航到另一个片段并再次返回时,再次调用该函数,但旧数据保留在回收器视图中,导致当我只在回收器视图中存在相同数据的多个副本时希望它调用一次或至少在回收器视图中只有一组数据
我尝试从活动而不是片段调用函数,将函数放入 onCreate 方法和数学 if-else 表达式都不会产生预期的效果。
我的代码:
MainFragment.kt
class MainFragment : Fragment() {
private var text1list = mutableListOf<String>()
private var text2list = mutableListOf<String>()
private var text3list = mutableListOf<String>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_main, container, false)
view.see_codes.setOnClickListener {
findNavController().navigate(R.id.action_mainFragment_to_listFragment2)
}
TestGet()
return view
}
val BASE_URL = "https://run.mocky.io/v3/"
private fun TestGet() {
val api = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(SimpleApi::class.java)
GlobalScope.launch(Dispatchers.IO) {
val response = api.phonehome()
try {
for (Mlist in response.Mlist){
Log.d("MainActivity", "Result + $Mlist")
addToList(Mlist.text1, Mlist.text2, Mlist.text3)
}
withContext(Dispatchers.Main){
setUpRecyclerView()
}
}catch (e: Exception){
println("you messed up the connection some how")
}
}
}
private fun setUpRecyclerView() {
main_recyclerview.layoutManager = LinearLayoutManager(this.context)
main_recyclerview.adapter = MainAdapter(text1list,text2list,text3list)
}
private fun addToList(text1: String, text2: String, text3: String){
text1list.add(text1)
text2list.add(text2)
text3list.add(text3)
}
}
我的适配器
MainAdapter.kt
class MainAdapter(
private var text1: List<String>, private var text2: List<String>, private var text3: List<String>) : RecyclerView.Adapter<MainAdapter.ViewHolder>() {
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
var itemtext1 : TextView = itemView.findViewById(R.id.note_text_view_1)
var itemtext2 : TextView = itemView.findViewById(R.id.note_text_view_2)
var itmetext3 : TextView = itemView.findViewById(R.id.note_text_View_3)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainAdapter.ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.carditem,parent,false)
return ViewHolder(v)
}
override fun getItemCount(): Int {
return text1.size
}
override fun onBindViewHolder(holder: MainAdapter.ViewHolder, position: Int) {
holder.itemtext1.text = text1[position]
holder.itemtext2.text = text2[position]
holder.itmetext3.text = text3[position]
}
}
感谢您的宝贵时间。
【问题讨论】:
标签: java android kotlin android-recyclerview retrofit