来自JSON数据的Android动态viewpager和tablayout

问题描述 投票:0回答:1

我正在关注本教程https://www.codexpedia.com/android/android-tablayout-with-many-tabs-kotlin/

我是修改方法来添加片段,但我需要跳转到tablayout中的特定选项卡。本教程没有正确返回标签位置(页面)和每次跳转(比如说标签5),总是加载每个标签(0,1,2,3,4,5)不直接到标签5,每个标签需要取数据从服务器,所以它花了很多时间在所有选项卡中获取数据。

上市类

class Listing : AppCompatActivity() {

// From server
var latitude = ""
var longitude = ""
var category:Int = 0

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_listing)

    getCategory()
}

fun getCategory(){
    val builder = AlertDialog.Builder(this)
    val dialogView=layoutInflater.inflate(R.layout.progress_dialog,null)
    builder.setView(dialogView)
    builder.setCancelable(false)
    val dialog = builder.create()
    dialog.show()

    var rq: RequestQueue = Volley.newRequestQueue(this)
    var sr = object : StringRequest(Request.Method.POST, user_info.get_category, Response.Listener { response ->
        //========================================================================================= data from server
        Handler().postDelayed({dialog.dismiss()},0)
        Log.i("AIM", response.toString())

        val pageAdapter = MyPagerAdapter(supportFragmentManager)

        var jsonObject = JSONObject(response)
        var data:JSONObject = jsonObject["data"] as JSONObject
        var jsonArray = data.getJSONArray("vendor_type")

        for (i in 0 until jsonArray.length()) {
            var jo = jsonArray.getJSONObject(i)

            var id  = jo["id"].toString()
            var nama = jo["nama"].toString()

            pageAdapter.add(FirstFragment.newInstance(i), nama)
            user_info.nama_category.add(i,nama)
            Log.d("aim","Fragment created")
        }

        viewpager_main.adapter = pageAdapter
        tabs_main.setupWithViewPager(viewpager_main)


        if (category != 0){
            var fix = category - 1
            viewpager_main.setCurrentItem(fix, false)
        }


    }, Response.ErrorListener { response ->
        //========================================================================================= error handling
        Handler().postDelayed({dialog.dismiss()},0)

        var networkResponse = response.networkResponse
        if (networkResponse == null){
            Toast.makeText(this, "Tidak terhubung dengan server", Toast.LENGTH_LONG).show()
        }

    }) {        }
    sr.retryPolicy = DefaultRetryPolicy(
            10000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
    )
    rq.add(sr)
  }
}

分段

class FirstFragment : Fragment() {

private val vendorData = mutableListOf<vendor_model>()

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_first, container, false)
    val page = getArguments()!!.getInt(PAGE_NUM)


    Log.d("aim", "page : $page")

    getVendor(page)

    return view
}

companion object {
    val PAGE_NUM = "PAGE_NUM"
    fun newInstance(page: Int): FirstFragment {
        val fragment = FirstFragment()
        val args = Bundle()
        args.putInt(PAGE_NUM, page)
        fragment.setArguments(args)
        return fragment
    }
}

fun getVendor(page: Int) {
    val builder = activity?.let { AlertDialog.Builder(it) }
    val dialogView = layoutInflater.inflate(R.layout.progress_dialog,null)
    builder?.setView(dialogView)
    builder?.setCancelable(false)
    val dialog = builder?.create()
    dialog?.show()

    var category = page + 1
    Log.d("aim", "category : $category")


    var rq: RequestQueue = Volley.newRequestQueue(activity)
    var sr = object : StringRequest(Request.Method.POST, url, Response.Listener { response ->
        Handler().postDelayed({dialog?.dismiss()},0)
        Log.i("AIM", response.toString())

        var jsonObject = JSONObject(response)
        var jsonArray = jsonObject.getJSONArray("list")

        for (i in 0 until jsonArray.length()) {
            var jo = jsonArray.getJSONObject(i)

            var jarak: String
            if (jo.isNull("distance")) {
                jarak = "Unknown"
            }else  jarak = jo["distance"].toString() + " Km"


            var id  = jo["id_vendor"].toString()
            var nama = jo["nama"].toString()
            //var jarak = jo["distance"].toString()
            var rating = jo["rating"].toString()
            var status = jo["is_open"].toString()
            var img = jo["file_logo"].toString()
            var category = jo["vendor_type"].toString()

            val mItem = vendor_model(id, nama, "$jarak", rating, status, img, category)
            vendorData.add(mItem)
        }

        // ============ recycler_nearme ============
        recyclerView.layoutManager = LinearLayoutManager(activity, OrientationHelper.VERTICAL,false)
        val vendorAdapter = vendor_adapter()
        recyclerView.adapter = vendorAdapter
        vendorAdapter.setList(vendorData)
        vendorData.clear()

    }, Response.ErrorListener { response ->
        Handler().postDelayed({dialog?.dismiss()},0)
        //========================================================================================= error handling

        Toast.makeText(activity, response.toString(), Toast.LENGTH_LONG).show()
        var networkResponse = response.networkResponse

        if (networkResponse == null){
            Toast.makeText(activity, "Tidak terhubung dengan server", Toast.LENGTH_LONG).show()
        }
        else {
            var code = networkResponse.statusCode
            var err = networkResponse.data
            Toast.makeText(activity, "Error : $code", Toast.LENGTH_LONG).show()
            Log.i("AIM", err.toString())
        }

    }) {
        override fun getParams(): MutableMap<String,String> {
            var map = HashMap<String, String>()

            map.put("text"          , "")
            map.put("tags"          , "")
            map.put("take"          , "10")
            map.put("skip"          , "0")
            map.put("sort_by"       , "asc")
            map.put("language"      , "[]")

            map.put("type"          , "")
            map.put("category"      , "[$category]")
            map.put("grade"         , "[]")

            map.put("nearme"        , "0")
            map.put("distance"      , "")
            map.put("location"      , "")
            map.put("latitude"      , "")
            map.put("longitude"     , "")

            map.put("open_now"      , "")
            map.put("price_min"     , "")
            map.put("price_max"     , "")

            map.put("rating"        , "")
            map.put("rating_max"    , "")
            map.put("rating_min"    , "")
            map.put("ratings"       , "[]")
            map.put("subject"       , "")


            return map
        }
    }
    sr.retryPolicy = DefaultRetryPolicy(
            3000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
    )
    rq.add(sr)
    Log.i("aim", sr.body.toString(Charset.defaultCharset()))
  }
}

适配器

class MyPagerAdapter(fm: FragmentManager): FragmentPagerAdapter(fm){

  private val tabNames: ArrayList<String>
  private val fragments: ArrayList<Fragment>

  init {
    tabNames = ArrayList()
    fragments = ArrayList()
  }

  fun add(fragment: Fragment, title: String) {
    tabNames.add(title)
    fragments.add(fragment)
  }

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

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

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

谢谢你的回答,真的很感激

android kotlin android-viewpager android-tablayout
1个回答
0
投票

您可以传递其他参数(第二个作为false):

viewpager_main.setCurrentItem(4, false)

设置true以平滑滚动到新项目,

设置false立即进行转换

© www.soinside.com 2019 - 2024. All rights reserved.