【发布时间】:2023-03-22 06:30:01
【问题描述】:
我想在资产文件夹的粘性标题 recyclerview 中按日期显示我的 JSON 数据。Array 列表已接收但未显示在 recyclerview 中。我不知道我的错误在哪里。当我添加 toast 时,它显示了一个完整的 JSON 列表。但没有显示在 recyclerview 中。
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: RecyclerView.Adapter<*>
private lateinit var viewManager: RecyclerView.LayoutManager
var jobsArray = arrayListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loadJSONFromAsset()
}
private fun loadJSONFromAsset() {
try {
val json: String?
val inputStream: InputStream = assets.open("test.json")
json = inputStream.bufferedReader().use { it.readText() }
var jsonArray = JSONArray(json)
for (i in 0..jsonArray.length()) {
var jsonObject = jsonArray.getJSONObject(i)
jobsArray.add(jsonObject.getString("data"))
}
viewManager = LinearLayoutManager(this)
recyclerView = findViewById<RecyclerView>(R.id.recycler_view).apply {
viewAdapter = JobsAdapter(jobsArray)
layoutManager = viewManager
adapter = viewAdapter
}
recyclerView.addItemDecoration(
StickyHeaderItemDecoration(
recyclerView,
viewAdapter as JobsAdapter
)
)
} catch (ex: IOException) {
ex.printStackTrace()
}
}
}
适配器类
class JobsAdapter(
private var jobsArray: ArrayList<String>): RecyclerView.Adapter<RecyclerView.ViewHolder>(), StickyHeaderItemDecoration.StickyHeaderInterface {
override fun isHeader(itemPosition: Int): Boolean {
return true
//return startTime[itemPosition].
}
override fun bindHeaderData(header: View, headerPosition: Int) {
((header as ConstraintLayout).getChildAt(0) as TextView).text =
jobsArray[headerPosition]
}
override fun getHeaderLayout(headerPosition: Int): Int {
return R.layout.row_header
}
override fun getHeaderPositionForItem(itemPosition: Int): Int {
var headerPosition = 0
var position = itemPosition
do {
if (this.isHeader(position)) {
headerPosition = position
break
}
position -= 1
} while (position >= 0)
return headerPosition
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if(viewType == TYPE_HEADER) {
ViewHolderHeader(LayoutInflater.from(parent.context)
.inflate(R.layout.row_header, parent, false))
} else {
ViewHolder(LayoutInflater.from(parent.context)
.inflate(R.layout.user_item, parent, false))
}
}
override fun getItemCount() = jobsArray.size
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if(holder is ViewHolder) {
holder.nameView.text = jobsArray[position]
} else if(holder is ViewHolderHeader) {
holder.headerView.text = jobsArray[position]
}
}
override fun getItemViewType(position: Int): Int {
return if(true) {
TYPE_HEADER
} else {
TYPE_ITEM
}
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val nameView = view.findViewById<TextView>(R.id.tv_name)
}
class ViewHolderHeader(view: View) : RecyclerView.ViewHolder(view) {
val headerView = view.findViewById<TextView>(R.id.headerView)
}
}
Json 数据(我放了一小块 json)
{
"data": [
{
"id": 2158,
"title": "job schedule 13",
"description": "job schedule 13 description\n",
"currency": "$",
"type": "2",
"days": "2",
"start_time": "2021-09-13 13:20:57",
"end_time": "2021-09-29 13:50:00",
"total_workers": 30,
"hourly_rate": 12,
"status": "Pending",
"user": {
"id": 165,
"name": "Asad Employer",
"email": "",
"mobile_number": "+92331435343",
"status": "Active",
"street_address": "ichra"
},
]
【问题讨论】:
-
你试过调试吗?在你使用的 recyclerview 中的
getItemCount()上尝试一下,看看适配器是否收到任何值 -
还有,为什么不将这些数据解析为
data class? -
当我调试这个时,我的应用程序在这一行崩溃了 var jsonArray = JSONArray(json),我不知道如何使用资产文件夹的数据类传递数据
-
错误信息是什么?并且强烈建议将您的数据解析为
data class以确保类型安全。 -
错误.. 原因:org.json.JSONException: Value (json response)
标签: java android json xml kotlin