मैं एक FragmentStatePagerAdapter (मुझे पता है, बहिष्कृत) के साथ 3 टैब पॉप्युलेट करने के लिए OkHttpClient का उपयोग कर रहा हूं - जो काम करता है, लेकिन जब मैं किसी अन्य गतिविधि में डेटा बदलता हूं और मुख्य गतिविधि पर वापस जाता हूं तो 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)
        }
    }

सेक्शनपेजर एडेप्टर है:

    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
    }

मैंने कई स्थानों पर एडाप्टर पर InformDataSetChanged() डालने का प्रयास किया है, लेकिन इसका कोई फायदा नहीं हुआ है। प्रारंभिक सरणी को लॉग करने से पता चलता है कि डेटा MainActivity में बदल गया है, लेकिन यह Fragments को पास नहीं किया जाता है।

किसी भी सुझाव को सराहा जाएगा!

0
kwishnu 1 अप्रैल 2020, 01:23

1 उत्तर

सबसे बढ़िया उत्तर

अंत में इसे के साथ हल किया

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()
            }
        }
    }

उम्मीद है कि यह किसी की मदद करता है!

0
kwishnu 1 अप्रैल 2020, 22:04