Android 如何使用api创建viewmodel?
类MainActivity:AppCompatActivity(){ 如何从mainActivity类创建viewModel类,以便在方向更改或数据保持完整时,解析中的数据不会更改。重点是如何使用api创建viewModel。如何使用api创建viewModelAndroid 如何使用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
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()
}
}
}