Android RecyclerView в Котлине - PullRequest
       31

Android RecyclerView в Котлине

0 голосов
/ 17 апреля 2019

Попытка научиться разрабатывать приложение для 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)
}

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

для адаптера:

class PostItemDetailsAdapter(private val postdetailsList: List<Attribute>, private val context: Context, val action: View.OnClickListener) :
    RecyclerView.Adapter<PostItemDetailsAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(context).inflate(R.layout.post_item_details,
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.itemView.(/*Pass your itemview name).setOnClickListener({it->
            /*Put log for that id */
            action.onClick(it)
        })

        //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)
}

Теперь поместите эти вещи в свою деятельность:

class MainActivity : AppCompatActivity() {
    lateinit var adapter: PostItemDetailsAdapter
    lateinit var action: View.OnClickListener
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            rv__list_posts.layoutManager = LinearLayoutManager(this)
            action = View.OnClickListener {
               //Things you want to do it in your On Click you can log 
            }
    }
}

Просто передайте значения параметров в адаптер:

rv__list_posts.adapter = PostItemDetailsAdapter(it, this, action)

Надеюсь, это сработает для вас. Если есть какие-либо проблемы, сообщите плохой чек.

0 голосов
/ 17 апреля 2019

Вы можете обрабатывать RecyclerView события щелчка в вашем адаптере (в BindViewHolder или YourViewHolder). Я предпочитаю открывать новые действия и показывать там детали

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,
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.itemView.setOnClickListener{
            //do sth in here
        }

        //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)
}
...