Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用api创建viewmodel?_Android_Json_Kotlin_Android Viewmodel - Fatal编程技术网

Android 如何使用api创建viewmodel?

Android 如何使用api创建viewmodel?,android,json,kotlin,android-viewmodel,Android,Json,Kotlin,Android Viewmodel,类MainActivity:AppCompatActivity(){ 如何从mainActivity类创建viewModel类,以便在方向更改或数据保持完整时,解析中的数据不会更改。重点是如何使用api创建viewModel。如何使用api创建viewModel private-var-listData:ArrayList=ArrayList() 私有lateinit变量适配器:UsersAdapter 伴星{ 内部val TAG=MainActivity::class.java.simpleN

类MainActivity:AppCompatActivity(){

如何从mainActivity类创建viewModel类,以便在方向更改或数据保持完整时,解析中的数据不会更改。重点是如何使用api创建viewModel。如何使用api创建viewModel

private-var-listData:ArrayList=ArrayList()
私有lateinit变量适配器:UsersAdapter
伴星{
内部val TAG=MainActivity::class.java.simpleName
}
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textbar:TextView=findViewById(R.id.toolbar)
textbar.text=标题
设置支持操作栏(工具栏)
适配器=用户适配器(listData)
RecycleServiceConfig()
searchData()
getDataHome()
}
私人娱乐搜索数据(){
用户_search.setOnQueryTextListener(对象:SearchView.OnQueryTextListener{
重写onQueryTextSubmit(查询:字符串):布尔值{
if(query.isEmpty()){
返回真值
}否则{
listData.clear()
getDataSearch(查询)
}
返回真值
}
重写onQueryTextChange(newText:String):布尔值{
返回错误
}
})
}
私人娱乐回收服务配置(){
recycleView.layoutManager=LinearLayoutManager(recycleView.context)
recycleView.setHasFixedSize(真)
可回收的,可回收的(
分割(
recycleView.context,
DividerItemDecoration.VERTICAL
)
)
}
私人娱乐getDataHome(){
progressBar.visibility=View.VISIBLE
val client=AsyncHttpClient()
client.addHeader(“授权”、“令牌------”)
client.addHeader(“用户代理”、“请求”)
val url=”https://api.github.com/users"
get(url,对象:AsyncHttpResponseHandler(){
一旦成功,就放弃乐趣(
状态代码:Int,
标题:数组,
回应者:ByteArray
) {
progressBar.visibility=View.INVISIBLE
val结果=字符串(ResponseBy)
Log.d(标记、结果)
试一试{
val jsonArray=jsonArray(结果)
for(在0中输入i直到jsonArray.length()){
val jsonObject=jsonArray.getJSONObject(i)
val用户名:String=jsonObject.getString(“登录”)
getDataDetail(用户名)
}
}捕获(e:例外){
Toast.makeText(this@MainActivity,e.留言,吐司。长度(短)
.show()
e、 printStackTrace()
}
}
覆盖故障(
状态代码:Int,
标题:数组,
回应者:再见,
错误:可丢弃
) {
progressBar.visibility=View.INVISIBLE
val errorMessage=何时(状态代码){
401->“$statusCode:错误请求”
403->“$statusCode:禁止”
404->“$statusCode:未找到”
else->“$statusCode:${error.message+“GIT”}”
}
Toast.makeText(this@MainActivity,错误消息,土司。长度(长)
.show()
}
})
}
private fun getDataDetail(id:String){
progressBar.visibility=View.VISIBLE
val client=AsyncHttpClient()
client.addHeader(“授权”、“令牌------”)的名称
client.addHeader(“用户代理”、“请求”)
val url=”https://api.github.com/users/$id“
get(url,对象:AsyncHttpResponseHandler(){
一旦成功,就放弃乐趣(
状态代码:Int,
标题:数组,
回应者:ByteArray
) {
progressBar.visibility=View.INVISIBLE
val结果=字符串(ResponseBy)
Log.d(标记、结果)
试一试{
val jsonObject=jsonObject(结果)
val用户名:String?=jsonObject.getString(“登录”).toString()
val name:String?=jsonObject.getString(“名称”).toString()
val avatar:String?=jsonObject.getString(“avatar_url”).toString()
val company:String?=jsonObject.getString(“公司”).toString()
val location:String?=jsonObject.getString(“位置”).toString()
val存储库:Int=jsonObject.getInt(“公共报告”)
val followers:Int=jsonObject.getInt(“followers”)
val following:Int=jsonObject.getInt(“following”)
listData.add(
数据用户(
用户名,
名称
阿凡达
公司,
位置,
存储库,
追随者,,
下列的
)
)
showRecyclerList()
}捕获(e:例外){
Toast.makeText(this@MainActivity,e.留言,吐司。长度(短)
.show()
e、 printStackTrace()
}
}
覆盖故障(
状态代码:Int,
标题:数组,
回应者:再见,
错误:可丢弃
) {
progressBar.visibility=View.INVISIBLE
val errorMessage=何时(状态代码){
401->“$statusCode:错误请求”
403->“$statusCode:禁止”
404->“$statusCode:未找到”
else->“$statusCode:${error.message+“DETAIL”}”
}
Toast.makeText(this@MainActivity,错误消息,土司。长度(长)
.show()
}
})
}
private fun getDataSearch(id:String){
progressBar.visibility=View.VISIBLE
val client=AsyncHttpClient(
private var listData: ArrayList<DataUsers> = ArrayList()
private lateinit var adapter: UsersAdapter

companion object {
    internal val TAG = MainActivity::class.java.simpleName
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val textbar: TextView = findViewById(R.id.toolbar)
    textbar.text = title
    setSupportActionBar(toolbarr)
    adapter = UsersAdapter(listData)

    recyclerViewConfig()
    searchData()
    getDataHome()
}

private fun searchData() {
    user_search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            if (query.isEmpty()) {
                return true
            } else {
                listData.clear()
                getDataSearch(query)
            }
            return true
        }

        override fun onQueryTextChange(newText: String): Boolean {
            return false
        }
    })
}

private fun recyclerViewConfig() {
    recycleView.layoutManager = LinearLayoutManager(recycleView.context)
    recycleView.setHasFixedSize(true)
    recycleView.addItemDecoration(
        DividerItemDecoration(
            recycleView.context,
            DividerItemDecoration.VERTICAL
        )
    )
}

private fun getDataHome() {
    progressBar.visibility = View.VISIBLE
    val client = AsyncHttpClient()
    client.addHeader("Authorization", "token -----")
    client.addHeader("User-Agent", "request")
    val url = "https://api.github.com/users"
    client.get(url, object : AsyncHttpResponseHandler() {
        override fun onSuccess(
            statusCode: Int,
            headers: Array<Header>,
            responseBody: ByteArray
        ) {
            progressBar.visibility = View.INVISIBLE
            val result = String(responseBody)
            Log.d(TAG, result)
            try {
                val jsonArray = JSONArray(result)
                for (i in 0 until jsonArray.length()) {
                    val jsonObject = jsonArray.getJSONObject(i)
                    val username: String = jsonObject.getString("login")
                    getDataDetail(username)
                }
            } catch (e: Exception) {
                Toast.makeText(this@MainActivity, e.message, Toast.LENGTH_SHORT)
                    .show()
                e.printStackTrace()
            }
        }

        override fun onFailure(
            statusCode: Int,
            headers: Array<Header>,
            responseBody: ByteArray,
            error: Throwable
        ) {
            progressBar.visibility = View.INVISIBLE
            val errorMessage = when (statusCode) {
                401 -> "$statusCode : Bad Request"
                403 -> "$statusCode : Forbidden"
                404 -> "$statusCode : Not Found"
                else -> "$statusCode : ${error.message + " GIT"}"
            }
            Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG)
                .show()
        }
    })
}



private fun getDataDetail(id: String) {
   progressBar.visibility = View.VISIBLE
    val client = AsyncHttpClient()
    client.addHeader("Authorization", "token -------")
    client.addHeader("User-Agent", "request")
    val url = "https://api.github.com/users/$id"
    client.get(url, object : AsyncHttpResponseHandler() {
        override fun onSuccess(
            statusCode: Int,
            headers: Array<Header>,
            responseBody: ByteArray
        ) {
           progressBar.visibility = View.INVISIBLE
            val result = String(responseBody)
            Log.d(TAG, result)
            try {
                val jsonObject = JSONObject(result)
                val username: String? = jsonObject.getString("login").toString()
                val name: String? = jsonObject.getString("name").toString()
                val avatar: String? = jsonObject.getString("avatar_url").toString()
                val company: String? = jsonObject.getString("company").toString()
                val location: String? = jsonObject.getString("location").toString()
                val repository: Int = jsonObject.getInt("public_repos")
                val followers: Int = jsonObject.getInt("followers")
                val following: Int = jsonObject.getInt("following")
                listData.add(
                    DataUsers(
                        username,
                        name,
                        avatar,
                        company,
                        location,
                        repository,
                        followers,
                        following
                    )
                )
                showRecyclerList()
            } catch (e: Exception) {
                Toast.makeText(this@MainActivity, e.message, Toast.LENGTH_SHORT)
                    .show()
                e.printStackTrace()
            }
        }

        override fun onFailure(
            statusCode: Int,
            headers: Array<Header>,
            responseBody: ByteArray,
            error: Throwable
        ) {
           progressBar.visibility = View.INVISIBLE
            val errorMessage = when (statusCode) {
                401 -> "$statusCode : Bad Request"
                403 -> "$statusCode : Forbidden"
                404 -> "$statusCode : Not Found"
                else -> "$statusCode : ${error.message + " DETAIL"}"
            }
            Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG)
                .show()
        }
    })
}

private fun getDataSearch(id: String) {
    progressBar.visibility = View.VISIBLE
    val client = AsyncHttpClient()
    client.addHeader("Authorization", "token ---------")
    client.addHeader("User-Agent", "request")
    val url = "https://api.github.com/search/users?q=$id"
    client.get(url, object : AsyncHttpResponseHandler() {
        override fun onSuccess(
            statusCode: Int,
            headers: Array<Header>,
            responseBody: ByteArray
        ) {
            progressBar.visibility = View.INVISIBLE
            val result = String(responseBody)
            Log.d(TAG, result)
            try {
                val jsonArray = JSONObject(result)
                val item = jsonArray.getJSONArray("items")
                for (i in 0 until item.length()) {
                    val jsonObject = item.getJSONObject(i)
                    val username: String = jsonObject.getString("login")
                    getDataDetail(username)
                }
            } catch (e: Exception) {
                Toast.makeText(this@MainActivity, e.message, Toast.LENGTH_SHORT)
                    .show()
                e.printStackTrace()
            }
        }

        override fun onFailure(
            statusCode: Int,
            headers: Array<Header>,
            responseBody: ByteArray,
            error: Throwable
        ) {
           progressBar.visibility = View.INVISIBLE
            val errorMessage = when (statusCode) {
                401 -> "$statusCode : Bad Request"
                403 -> "$statusCode : Forbidden"
                404 -> "$statusCode : Not Found"
                else -> "$statusCode : ${error.message + " GIT"}"
            }
            Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG)
                .show()
        }
    })
}

private fun showRecyclerList() {
    recycleView.layoutManager = LinearLayoutManager(this)
    val listDataAdapter =
        UsersAdapter(userFilterList)
    recycleView.adapter = adapter

    listDataAdapter.setOnItemClickCallback(object : UsersAdapter.OnItemClickCallback {
        override fun onItemClicked(dataUsers: DataUsers) {
            showSelectedData(dataUsers)
        }
    })
}

private fun showSelectedData(dataUsers: DataUsers) {
    val dataUser = DataUsers(
        dataUsers.username,
        dataUsers.name,
        dataUsers.avatar,
        dataUsers.company,
        dataUsers.location,
        dataUsers.repository,
        dataUsers.followers,
        dataUsers.following
    )
    val intentDetail = Intent(this@MainActivity, DetailActivity::class.java)
    intentDetail.putExtra(DetailActivity.EXTRA_DATA, dataUser)
    startActivity(intentDetail)
}
var userFilterList = ArrayList<DataUsers>()
private lateinit var mcontext: Context


init {
    userFilterList = listData
}

inner class UserHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var imageAvatar: CircleImageView = itemView.avatar
    var name: TextView = itemView.user_name
    var company: TextView = itemView.company
}

private lateinit var onItemClickCallback: OnItemClickCallback

fun setOnItemClickCallback(onItemClickCallback: OnItemClickCallback) {
    this.onItemClickCallback = onItemClickCallback
}

interface OnItemClickCallback {
    fun onItemClicked(dataUsers: DataUsers)
}

override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): UserHolder {
    val view: View = LayoutInflater.from(viewGroup.context)
        .inflate(R.layout.item_row_users, viewGroup, false)
    val sch = UserHolder(view)
    mcontext = viewGroup.context
    return sch
}

override fun getItemCount(): Int {
    return userFilterList.size
}

override fun onBindViewHolder(holder: UserHolder, position: Int) {
    val data = userFilterList[position]
    Glide.with(holder.itemView.context)
        .load(data.avatar)
        .apply(RequestOptions().override(250, 250))
        .into(holder.imageAvatar)
    holder.name.text = data.name
    holder.company.text = data.company
    holder.itemView.setOnClickListener {
        val dataUser = DataUsers(
            data.username,
            data.name,
            data.avatar,
            data.company,
            data.location,
            data.repository,
            data.followers,
            data.following
        )
        val intentDetail = Intent(mcontext, DetailActivity::class.java)
        intentDetail.putExtra(DetailActivity.EXTRA_DATA, dataUser)
        mcontext.startActivity(intentDetail)
    }
}

override fun getFilter(): Filter {
    return object : Filter() {
        override fun performFiltering(constraint: CharSequence): FilterResults {
            val charSearch = constraint.toString()
            userFilterList = if (charSearch.isEmpty()) {
                listData
            } else {
                val resultList = ArrayList<DataUsers>()
                for (row in userFilterList) {
                    if ((row.username.toString().toLowerCase(Locale.ROOT)
                            .contains(charSearch.toLowerCase(Locale.ROOT)))
                    ) {
                        resultList.add(
                            DataUsers(
                                row.username,
                                row.name,
                                row.avatar,
                                row.company,
                                row.location,
                                row.repository,
                                row.followers,
                                row.following
                            )
                        )
                    }
                }
                resultList
            }
            val filterResults = FilterResults()
            filterResults.values = userFilterList
            return filterResults
        }

        @Suppress("UNCHECKED_CAST")
        override fun publishResults(constraint: CharSequence, results: FilterResults) {
            userFilterList = results.values as ArrayList<DataUsers>
            notifyDataSetChanged()
        }
    }
}