Как сделать повторное представление на viewpager из асинхронного сообщения HTTP - PullRequest
0 голосов
/ 23 октября 2019

В настоящее время при разработке приложения в Котлине фактически необходимо иметь две различные области, которые можно перелистывать между результатами использования базы данных.

Поэтому, чтобы сделать это прямо сейчас, я использую панель просмотра, подключенную к 2 фрагментам,фрагмент1 работает отлично, потому что я могу заполнить его из своей основной деятельности и потому, что он просто использует некоторые TextViews.

Фрагмент 2, однако, заполняется представлением реселлера с переменным числом элементов.

Оба этиисходить из асинхронного HTTP-сообщения, которое отправляется на наш веб-сайт, например, в виде строки в формате «45,1,5,7», которую я затем преобразовываю в ArrayList в Kotlin.

Похоже, проблема заключается в том, что этот массив разбивают на фрагмент 2. перед тем, как перейти к нему.

В последние несколько дней я пробовал разные решения, но на самом деле я не могу получить информацию ни от одного из них. .

Я также пытался разместить вызов адаптера внутри самой функции Async, но он не отображаетфрагменты, когда я это делаю.

Единственная вещь, которая до сих пор давала правильные результаты, - это поместить второй пост-запрос внутрь самого фрагмента2, однако это сработало только после того, как оно было проведено, и не выполнило это прямо. и то и другое не очень подходит для того, что я преследую.

В коде есть нечто большее, чем просто это, так что я собираюсь показать только соответствующие части.

Main Activity oncreate (stripped)alot):

    @Override
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)


        window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_FULLSCREEN

        actionBar?.hide()

        setContentView(R.layout.activity_main)



        grabtraps() // Effectivelly where the Async function is done

        val adapter = MyViewPagerAdapter(supportFragmentManager)
        adapter.addFragment(fragment_1() , " One ")
        adapter.addFragment(Fragment2() , " Two ")
        //     adapter.addFragment(FragmentThree() , " Three ")
        //     adapter.addFragment(FragmentFour() , " Four ")
        vpPager.adapter = adapter

        val tabs2 = findViewById<TabLayout>(R.id.tabs);
        tabs2.setupWithViewPager(vpPager)

// Like I said earlier, tried this inside the function but didn't show up in general.


    }

Grabtraps () - все еще в MainActivity - я лишился многих вещей, касающихся фрагмента1, так как он работает


    fun grabtraps(){


        val sharedPref: SharedPreferences = getSharedPreferences(PREF_NAME, PRIVATE_MODE)

        val username = sharedPref.getString("user", "Not logged in")

        val jsoncode = JSONObject()
        jsoncode.put("username", username)

// Basically getting username into the HTTPS Post, PHP pics it up on the otherside

        "https://fakesite.com/gettraps.php".httpPost()
                .header("Content-Type", "application/json")
                .body(jsoncode.toString())
                .response{
                    request, response, result ->
                    when (result) {

                        is Result.Failure -> {

// Can probably skip this side - occurs if fails to connect.

                            mResultTextView = findViewById(R.id.result_textview)



                            var inputto = sharedPref.getString("user", "Please Log in")
                            if(inputto != "Please Log in"){
                                inputto = "Welcome, $inputto"
                            }
                            mResultTextView.text = inputto


                        }
                        is Result.Success -> {

                            val output = String(response.data)

                            val delimiter = ","

                            val parts = output.split(delimiter)

// Effectivelly just the output then put into an ArrayList<String>


                            var myDataset = ArrayList<String>()
                            myDataset.add("1")
                            myDataset.add("2")
                            myDataset.add("3")
// Decided to just test with dummydata for now till I can see it

                            val test = Fragment2.MyAdapter(myDataset)

//Accidently didn't remove this part, but was trying this along with some other code I got rid of to test fragment2, didn't work though.


                            val sitespref: SharedPreferences = getSharedPreferences(LAST_SITES, PRIVATE_MODE)


                            val editor3 = sitespref.edit()

                            editor3.clear()
                            editor3.putString("sites",output)
                            editor3.apply()

//Tried using getsharedpreferences, saving the content then loading it on the otherside, as expected though it just loads up from the last time I did this so results are outdated.


                            mResultTextView = findViewById(R.id.result_textview)



                            findViewById<TextView>(R.id.catchsitevariable).text = parts[0]

// Was just a test to see if I could override it the same way as the others - catchsitevariable is a textview in my recyclerview on the viewpager fragment






                        }
                    }
                }

    }


MyViewPagerAdapter - все еще в MainActivity, работаетправильно, но я полагал, что Id включает его на всякий случай, так как он подходит


    class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){

        private val fragmentList : MutableList<Fragment> = ArrayList()
        private val titleList : MutableList<String> = ArrayList()

        override fun getItem(position: Int): Fragment {
            return fragmentList[position]
        }

        override fun getCount(): Int {
            return fragmentList.size
        }

        fun addFragment(fragment: Fragment,title:String){
            fragmentList.add(fragment)
            titleList.add(title)
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return titleList[position]
        }

    }




Фрагмент 2: Oncreateview / onviewCreated




    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {

        val name = arguments?.getString(ARG_NAME)


               return inflater.inflate(R.layout.page2fragment, container, false)

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        var recyclerView: RecyclerView = view.findViewById<RecyclerView>(R.id.recyclesites)

var myDataset = ArrayList<String>()


        val sharedPref: SharedPreferences = this.activity!!.getSharedPreferences(PREF_NAME, PRIVATE_MODE)

        val username = sharedPref.getString("user", "Not logged in")

        val sites: SharedPreferences = this.activity!!.getSharedPreferences(LAST_SITES, PRIVATE_MODE)

        val output = sites.getString("sites","")

        println("output is $output")

// Was using this to test saving it, if nothing saved just comes out "output is" otherwise comes out with the previous result, this is getting called before the Async request in MainActivity is done.

        val delimiter = ","

        val parts = output.split(delimiter)

        viewManager = LinearLayoutManager(getActivity())
        viewAdapter = MyAdapter(myDataset)

        recyclerView = view.findViewById<RecyclerView>(R.id.recyclesites).apply {
            setHasFixedSize(true)

            layoutManager = viewManager

            val adapter = MyAdapter(myDataset)
            adapter.replaceItems(myDataset)
            adapter.getItemCount()
            adapter.testing(findViewById<RecyclerView>(R.id.recyclesites))
            recyclerView.adapter = adapter


        }

    }


MyAdapter - для фрагмента 2, используемого для повторного просмотра


    class MyAdapter(private val myDataset: ArrayList<String>) :
            RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

        private var items = ArrayList<String>()

        class MyViewHolder(val textView: RelativeLayout) : RecyclerView.ViewHolder(textView)


        override fun onCreateViewHolder(parent: ViewGroup,
                                        viewType: Int): MyAdapter.MyViewHolder {

            val textView = LayoutInflater.from(parent.context)
                    .inflate(R.layout.recyclesites, parent, false) as RelativeLayout
            return MyViewHolder(textView)
        }
        fun replaceItems(items: ArrayList<String>) {
            this.items = items
            notifyDataSetChanged()
        }
        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
            holder.textView.text = myDataset[position]
        }

        fun testing(parent: ViewGroup): MyAdapter.MyViewHolder{
            val textView = LayoutInflater.from(parent.context)
                    .inflate(R.layout.recyclesites, parent, false) as RelativeLayout
            return MyViewHolder(textView)

//Effectivelly what I used to inflate the actual inner parts of the recyclerview

        }
        // Return the size of your dataset (invoked by the layout manager)
        override fun getItemCount(): Int{
            println(myDataset.size)
// Was coming out 0 for most attempts when trying to send the data across.

            return myDataset.size
        }
    }







Совершенно новый для Stackoverflow и Kotlin, дайте мне знать, если я что-то пропустил.

Заранее спасибо.

1 Ответ

0 голосов
/ 23 октября 2019

Первым подходом должен быть вызов API из самого второго фрагмента.

Установите для setOffscreenPageLimit вашего ViewPager значение 1, чтобы он также загружал второй фрагмент и проверял жизненный цикл фрагмента, чтобы увидеть, где ваш вызов API подходит для теста. .

onCreateView () второго фрагмента. После того, как API отзовет данный результат, свяжите его с View.

Вы также можете подумать об этом, когда вы получите событие, когда страница изменения пользователя https://developer.android.com/reference/android/support/v4/view/ViewPager.SimpleOnPageChangeListener.html#onPageSelected(int). Когда позиция страницы равна 1, вы можете вызвать API, если данныенедоступен.

...