Попытка научиться разрабатывать приложение для Android и столкнуться с чем-то, что кажется основной проблемой, но не может понять, как двигаться дальше.У меня есть RecyclerView
, который правильно отображает список API, и я понимаю, как это сделать.Далее я хочу, чтобы пользователь щелкнул элемент (передав идентификатор устройства), и он подробно расскажет об элементе, передающем другой вызов API (другой URL).Чего я не понимаю, так это как перейти к деталям после клика.
Я отлаживаю код и правильно регистрирую клики с идентификатором устройства, но не уверен, куда идти дальше.Должен ли я как-то «обновить» RecyclerView и отобразить новые данные, или я создаю новое действие и отобразлю там результаты?
Список устройств API
[
{
"id": "65",
"name": "Switch - Kitchen",
"label": "Switch - Kitchen"
},
{
"id": "98",
"name": "Location Sensor - 1",
"label": "Location Sensor - 1"
},
{
"id": "99",
"name": "Location Sensor - 2",
"label": "Location Sensor - 2"
},
{
"id": "136",
"name": "Switch - Bedroom",
"label": "Switch - Bedroom"
},
{
"id": "161",
"name": "Location Sensor - 3",
"label": "Location Sensor - 3"
},
{
"id": "193",
"name": "Switch - Family Room",
"label": "Switch - Family Room"
}
]
API сведений об устройстве
{
"id": "65",
"name": "Switch - Kitchen",
"label": "Switch - Kitchen",
"attributes": [
{
"name": "switch",
"currentValue": "off",
"dataType": "ENUM",
"values": [
"on",
"off"
]
}
],
"capabilities": [
"Switch",
{
"attributes": [
{
"name": "switch",
"dataType": null
}
]
},
"Configuration",
"Refresh",
"Actuator"
],
"commands": [
"configure",
"flash",
"off",
"on",
"refresh",
"refresh"
]
}
Основная активность
class MainActivity : AppCompatActivity() {
//Global Variable for Device ID//
class vdeviceID: Application() {
companion object{
var globalDeviceID = 0
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
rv__list_posts.layoutManager = LinearLayoutManager(this)
//Debugging URL//
val interceptor : HttpLoggingInterceptor = HttpLoggingInterceptor().apply {
this.level = HttpLoggingInterceptor.Level.BODY
}
val client : OkHttpClient = OkHttpClient.Builder().apply {
this.addInterceptor(interceptor)
}.build()
//Debugging URL//
//Base of API Call//
val retrofit = Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl("http://xxx.xxx.xxx.xxx/apps/api/109/")
.client(client)
.build()
//Base of API Call//
//Build List of Devices//
val postsApi = retrofit.create(INetworkAPI::class.java)
var response = postsApi.getAllPosts(access_token = "xxxxxxx")
//Displaying List//
response.observeOn(AndroidSchedulers.mainThread()).subscribeOn(IoScheduler()).subscribe {
rv__list_posts.adapter = PostItemAdapter(it, this)
}
Вызов API
interface INetworkAPI {
@GET("devices")
fun getAllPosts(@Query("access_token") access_token: String): Observable<List<DevicesList>>
}
Адаптер элемента
class PostItemAdapter(private val postList: List<DevicesList>, private val context: Context) :
RecyclerView.Adapter<PostItemAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(context).inflate(R.layout.post_item_layout, parent, false)
)
}
override fun getItemCount(): Int {
return postList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val globalDeviceID = this.postList[position].id
holder.itemView.txtPostID.text = this.postList[position].id
holder.itemView.txtPostName.text = this.postList[position].name
holder.itemView.txtPostLabel.text = this.postList[position].label
holder.itemView.setOnClickListener {
v -> Log.d("TAG", globalDeviceID)
}
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view)
}
Хотите отобразить это после нажатия
//Specific Devices//
val postsDetailsApi = retrofit.create(INetworkAPIDetails::class.java)
var responseDetails = postsDetailsApi.getAllDetails(access_token = "xxxxxxx")
//Displaying List//
responseDetails.observeOn(AndroidSchedulers.mainThread()).subscribeOn(IoScheduler()).subscribe {
rv__list_posts.adapter = PostItemDetailsAdapter(it, this)
}
API конкретного устройства
interface INetworkAPIDetails {
@GET("devices/")
fun getAllDetails(@Query("access_token") access_token: String): Observable<List<DeviceDetails>>
fun getAllDetailsAttr(): Observable<List<Attribute>>
}
Интерфейс конкретного устройства
class PostItemDetailsAdapter(private val postdetailsList: List<Attribute>, private val context: Context) :
RecyclerView.Adapter<PostItemDetailsAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(context).inflate(R.layout.post_item_details,
parent, false))
}
override fun getItemCount(): Int {
return postdetailsList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
//holder.itemView.txtPostID.text = this.postdetailsList[position].id
holder.itemView.txtPostName.text = this.postdetailsList[position].name
holder.itemView.txtPostCurrent.text = this.postdetailsList[position].currentValue
holder.itemView.txtPostDataType.text = this.postdetailsList[position].dataType
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view)
}