【问题标题】:Android dynamic viewpager and tablayout from JSON data来自 JSON 数据的 Android 动态查看器和 tablayout
【发布时间】:2019-03-29 00:06:27
【问题描述】:

我正在关注这个教程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]
  }
}

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

【问题讨论】:

  • 你的viewpager_main.setCurrentItem(4) 不起作用?
  • 它可以工作,但是从 0 到 4 (0,1,2,3,4) 加载每个选项卡,而不是直接加载到 4,这需要时间。 @博肯

标签: android kotlin android-viewpager android-tablayout


【解决方案1】:

您可以传递额外的参数(第二个为false):

viewpager_main.setCurrentItem(4, false)

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

设置false 立即进行过渡

【讨论】:

  • 我都试过“viewpager_main.setCurrentItem(fix, false)”,结果是一样的。片段总是一个接一个地运行。现在我将尝试使用静态片段(每个类别一个)。但问题是当应用程序更新其他类别时需要再次创建片段。
猜你喜欢
  • 2023-03-02
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2015-09-17
  • 2012-01-21
相关资源
最近更新 更多