如何在Tabbed Adapter上调用notifyDatasetChanged



我正在使用OkHttpClient用FragmentStatePagerAdapter(我知道,不推荐使用(填充3个选项卡,这是有效的,但当我在另一个活动中更改数据并返回到MainActivity时,RecyclerView不会更新,尽管我试图在我能想到的任何地方调用notifyDataSetChanged((。这个问题以各种形式被问了无数次,但没有一个答案能让我有所收获。

我的主要活动是:

private lateinit var viewPager: ViewPager
private var InventoryItems: MutableList<MutableList<String>> = ArrayList()
class MainActivity() : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewPager = findViewById(R.id.view_pager)
callServer()
}
private fun callServer(){
...
override fun onResponse(call: Call, response: Response){
response.use {
if (!response.isSuccessful) throw IOException("Unexpected code $response")
val resp = response.body!!.string()
this@MainActivity.runOnUiThread(Runnable {
parseJsonStr(resp)//loads InventoryItems array from Json response
//logging server response shows data in array is changed
setTabs()
})
}
}
}
private fun setTabs(){
pagerAdapter = SectionsPagerAdapter(supportFragmentManager, InventoryItems, this@MainActivity)
viewPager.adapter = pagerAdapter
val tabs: TabLayout = findViewById(R.id.tabs)
tabs.setupWithViewPager(viewPager)
pagerAdapter.notifyDataSetChanged()//(...doesn't work here, or at the top of this function)
}
}

Sections PagerAdapter是:

private var InventoryTab1: MutableList<MutableList<String>> = ArrayList()//and same for Tab 2 and 3
class SectionsPagerAdapter(
fm: FragmentManager,
private val invItems: MutableList<MutableList<String>>,
private val context: Context
): FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItem(position: Int): Fragment {
...//load tab arrays from invItems
return when (position) {
0 -> FirstFragment(InventoryTab1)
1 -> SecondFragment(InventoryTab2)
else -> ThirdFragment(InventoryTab3)
}
}
override fun getItemPosition(`object`: Any): Int {
return POSITION_NONE//tried this because of some SO answers
}
}

并且片段是:

private lateinit var rootView: View
private lateinit var recyclerView: RecyclerView
class FirstFragment(private val items: MutableList<MutableList<String>>) : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
rootView = inflater.inflate(R.layout.fragment_first, container, false)
recyclerView = rootView.findViewById(R.id.bk_rv)
recyclerView.layoutManager = LinearLayoutManager(activity)
fun clickListener(position: Int) {
//intent to start other activity that changes server data
startActivity(intent)
}
val listener = { i: Int -> clickListener(i) }
val inventoryAdapter = activity?.let { InventoryAdapter( items, it, listener ) }
recyclerView.adapter = inventoryAdapter
recyclerView.adapter?.notifyDataSetChanged()//(...doesn't work here either)
return rootView
}

我曾尝试在适配器的多个位置放置notifyDataSetChanged((,但没有成功。记录初始数组显示MainActivity中的数据发生了更改,但这并没有传递给Fragments。

任何建议都将不胜感激!

最终用解决了这个问题

startActivityForResult(intent, 1)

在我的片段中(很多SO问题都解决了这个问题,这个链接的教程很好(;然后

val intent = Intent()
intent.putExtra("index", rowNumStr)
intent.putExtra("newValue", newValueStr)
setResult(Activity.RESULT_OK, intent)
finish()

在向服务器提交更改的活动中;并返回片段:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
val indexStr = data?.getStringExtra("index")
val valueStr = data?.getStringExtra("newValue")
items[indexStr!!.toInt()][5] = valueStr.toString()
recyclerView.adapter?.notifyDataSetChanged()
}
}
}

希望这能帮助到别人!

最新更新