欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android kotlin RecyclerView遍歷json實現列表數據的案例

 更新時間:2024年08月02日 10:49:17   作者:代碼x手莓莓  
這篇文章主要介紹了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 6.0下webview的定位權限設置方法

    android 6.0下webview的定位權限設置方法

    今天小編就為大家分享一篇android 6.0下webview的定位權限設置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Android?hid發(fā)送apdu格式數據示例詳解

    Android?hid發(fā)送apdu格式數據示例詳解

    這篇文章主要介紹了Android?hid發(fā)送apdu格式數據,在?Android?中,如果你想通過?HID(Human?Interface?Device)發(fā)送?APDU?格式的數據,通常會涉及?USB?HID?設備或藍牙?HID?設備,本文給大家講解的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Android Scroll實現彈性滑動_列表下拉彈性滑動的示例代碼

    Android Scroll實現彈性滑動_列表下拉彈性滑動的示例代碼

    下面小編就為大家分享一篇Android Scroll實現彈性滑動_列表下拉彈性滑動的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • android中貝塞爾曲線的應用示例

    android中貝塞爾曲線的應用示例

    本篇文章主要介紹了android中貝塞爾曲線的應用示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Android View.Post 的原理及缺陷

    Android View.Post 的原理及缺陷

    這篇文章主要介紹了Android View.Post 的原理及缺陷,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下
    2021-03-03
  • Android studio 三大模擬器比較(圖文詳解)

    Android studio 三大模擬器比較(圖文詳解)

    這篇文章主要介紹了Android studio 三大模擬器比較,本文圖文并茂給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android網絡請求-sign參數的設置方式

    Android網絡請求-sign參數的設置方式

    這篇文章主要介紹了Android網絡請求-sign參數的設置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • android教程之使用asynctask在后臺運行耗時任務

    android教程之使用asynctask在后臺運行耗時任務

    AsyncTask用在需要在ui線程中調用、在背景線程中執(zhí)行耗時任務、并且在ui線程中返回結果的場合。下面就是一個在背景中運行的AsyncTask的實現DownloadDBTask
    2014-02-02
  • 用Kotlin實現Android點擊事件的方法

    用Kotlin實現Android點擊事件的方法

    本篇文章主要介紹了用Kotlin實現Android點擊事件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android之FanLayout制作圓弧滑動效果

    Android之FanLayout制作圓弧滑動效果

    這篇文章主要介紹了Android之FanLayout制作圓弧滑動效果,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08

最新評論