Android kotlin RecyclerView遍歷json實現列表數據的案例
需求
效果圖如下 :
這個ui看起來簡單, 其實要實現幾個功能點
1. json數據的遍歷
2. RecyclerView實現循環(huán)的列表
3. 每塊元素里的元素點擊 : 未選中的話, 首次點擊顯示"selected", 點擊"selected"則進行下一步數據處理
4. 設置默認的選擇的元素, 顯示selected
代碼
1. layout/item_region.xml 組件元素
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="50dp"> // 這里的高度需要注意, 就是每個需要遍歷的元素的高度, 千萬要寫成不match_parent <LinearLayout android:id="@+id/item_region" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/bottom_border_white" android:gravity="center_vertical"> <TextView android:id="@+id/regionName" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_weight="2" android:text="China" android:textColor="@color/colorPrimary" android:textSize="16sp" /> <LinearLayout android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/selectedBtn" android:layout_width="80dp" android:layout_height="wrap_content" android:text="Selected" android:textColor="@color/colorPrimary" android:textSize="16sp" android:visibility="invisible" /> <ImageView android:layout_width="10dp" android:layout_height="15dp" android:layout_marginLeft="15dp" android:src="@drawable/right_arrow" /> </LinearLayout> </LinearLayout> </LinearLayout>
2. activity_update_region.xml 主頁面
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/main_bg_color" android:orientation="vertical" > <LinearLayout android:id="@+id/updateArea_view" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="50dp" android:layout_marginLeft="20dp" android:layout_marginTop="40dp" android:gravity="center_vertical" android:text="All regions" android:textColor="@color/colorPrimary" android:textSize="16sp" android:textStyle="bold" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/regionListRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" /> </LinearLayout> </RelativeLayout>
3. Myactivity.kt
import kotlinx.android.synthetic.main.activity_update_area.regionListRecyclerView data class Country(val name: String, val code: Int, var selected: Boolean) /** * 設置頁 */ class AreaupdateActivity : AppCompatActivity() { private lateinit var adapter: SimpleAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_update_area) // 讀取文件內容 val jsonString = loadJsonFromAssets(this, "country.json") val gson = Gson() val countryName = "China" val countrys: List<Country> = gson.fromJson(jsonString, type) // 設置默認的被選中的countryName selected if (countryName != null) { for (item in countrys) { if (item.name == countryName){ item.selected = true } } } regionListRecyclerView.layoutManager = LinearLayoutManager(this) adapter = SimpleAdapter(countrys) regionListRecyclerView.adapter = adapter // 元素的點擊事件 adapter.setOnItemClickListener(object : SimpleAdapter.OnItemClickListener { override fun onItemClick(position: Int, item: Country) { println("我點擊的$item") adapter.notifyItemChanged(position, item) // .indexOf(item) } }) } // 如果JSON文件位于assets目錄下, 這是處理非代碼資源文件(如文本、JSON等)的方式。通過AssetManager來訪問這些文件。 fun loadJsonFromAssets(context: Context, fileName: String): String { val assetManager = context.assets val reader: BufferedReader var jsonString: String = "" try { reader = BufferedReader(InputStreamReader(assetManager.open(fileName))) jsonString = reader.use { it.readText() } } catch (e: Exception) { e.printStackTrace() // 處理異常情況 } return jsonString } // SimpleAdapter 適配器, 監(jiān)聽列表元素 // 為了代碼的優(yōu)雅, 應該單獨寫在Adapter里 class SimpleAdapter(private val countrys: List<Country>) : RecyclerView.Adapter<SimpleAdapter.SimpleViewHolder>() { private var selectedPosition = RecyclerView.NO_POSITION inner class SimpleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val regionName: TextView = itemView.findViewById(R.id.regionName) val selectedBtn: TextView = itemView.findViewById(R.id.selectedBtn) init { itemView.setOnClickListener { // 在這里處理點擊事件 onItemClickListener?.let { listener -> selectedPosition = adapterPosition notifyDataSetChanged() if (selectedPosition != RecyclerView.NO_POSITION) { listener.onItemClick(selectedPosition, getItem(selectedPosition)) } } } } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_region, parent, false) return SimpleViewHolder(view) } interface OnItemClickListener { fun onItemClick(position: Int, item: Country) } private var onItemClickListener: OnItemClickListener? = null fun setOnItemClickListener(listener: OnItemClickListener) { onItemClickListener = listener } override fun onBindViewHolder(holder: SimpleViewHolder, position: Int) { val currentItem = getItem(position) holder.regionName.text = countrys[position].name // 點擊的顯示selected, 其他隱藏 holder.selectedBtn.visibility = if (position == selectedPosition) View.VISIBLE else View.INVISIBLE // 初始化數據 currentItem.selected為true的顯示 // 點擊的時候 原currentItem.selected為true的變?yōu)閒alse, 點擊的這個元素selected顯示 if (currentItem.selected) { currentItem.selected = !currentItem.selected holder.selectedBtn.visibility = View.VISIBLE println("我顯示著") } // 點擊selected holder.selectedBtn.setOnClickListener { var countryStr = currentItem.name CoroutineScope(Dispatchers.IO).launch { updateInfo(countryStr) // 更新用戶數據(自定義function) } } } override fun getItemCount(): Int = countrys.size fun getItem(position: Int): Country { return countrys[position] } } }
4. assets/country.json (示例)
[{ "selected": false, "country_id": 100006, "country_code": 244, "name": "Angola", "country_name_cn": "安哥拉", "ab": "AO" }, { "selected": false, "country_id": 100008, "country_code": 355, "name": "Albania", "country_name_cn": "阿爾巴尼亞", "ab": "AL" }]
完成!
其中難點是上述第3條功能, 因為需要操作item里的元素, 相比item, 里面的元素更難獲取和操作, 其次是selected的初始化和兩次點擊的操作, 還有點擊時其他selected的隱藏
對比uniapp的感受 :
① 組件的適配器和數據監(jiān)聽交給開發(fā)者去寫, 此為難度一, 而uniapp僅需一個v-for完成遍歷
② 點擊事件的處理, Android需要開發(fā)者自己找到選中的元素及其子元素, 再對其及其兄弟元素操作, 有點類似jquery, 操作dom節(jié)點, 而非vue一樣操作數據, 邏輯性會更強一些
到此這篇關于Android kotlin RecyclerView遍歷json實現列表數據的文章就介紹到這了,更多相關Android kotlin RecyclerView列表數據內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android Scroll實現彈性滑動_列表下拉彈性滑動的示例代碼
下面小編就為大家分享一篇Android Scroll實現彈性滑動_列表下拉彈性滑動的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01android教程之使用asynctask在后臺運行耗時任務
AsyncTask用在需要在ui線程中調用、在背景線程中執(zhí)行耗時任務、并且在ui線程中返回結果的場合。下面就是一個在背景中運行的AsyncTask的實現DownloadDBTask2014-02-02