之前几次我们弄好了java对接萤石云sdk的项目,并将其转为了kotlin语言格式。
现在我们已实现的功能有:显示指定设备,云台控制。
接下来,我们需要对接sdk的另一个功能,设备列表。让登陆者可以选择播放哪台设备。
首先,我们需要建立一个listview。
activity_main.xml
<ListView
android:id="@+id/device_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
另外,我们需要定义列表的样式,这里可以简单一点,设置一个名字和在线状态即可。
camera_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:gravity="center">
<TextView
android:id="@+id/item_name"
android:layout_width="250dp"
android:layout_height="40dp"
android:textSize="30dp"
android:text="@string/item_name"
android:gravity="center_vertical"/>
<TextView
android:id="@+id/item_status"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:textSize="24dp"
android:text="@string/item_offline"
android:layout_toRightOf="@+id/item_name"
android:gravity="center"/>
</RelativeLayout>
</LinearLayout>
建立完xml样式表,我们先设置一下设备的item属性。作为需要调用的设备,我们需要知道它的名字,Serial,还有在线状态。其他的并非必要,这里就不建立了。
CameraItem
class CameraItem(deviceName: String, deviceSerial: String, status: Int) {
private var cameraName:String ?= deviceName;
private var cameraSN:String ?= deviceSerial;
private var cameraStatus:Int ?= status;
public fun getCameraName(): String {
return cameraName!!
}
public fun getCameraSN():String{
return cameraSN!!
}
public fun getCameraStatus():Int{
return cameraStatus!!
}
fun setCameraName(cameraName: String){
this.cameraName = cameraName;
}
fun setCameraSN(cameraSN: String){
this.cameraSN = cameraSN;
}
fun setCameraStatus(cameraStatus: Int){
this.cameraStatus = cameraStatus;
}
}
注意,kotlin里,我们没有定义构造函数了。也就是在kotlin中,构造函数已经没有重构了,而是分为主构造函数和次级构造函数,具体知识可以通过一篇文章学会Kotlin中的构造函数这篇文章来了解,这里就不阐述了。
设置好camera类之后,我们需要设置Adapter
CameraAdapter
class CameraAdapter(var context: Context,var list:ArrayList<CameraItem>):BaseAdapter(){
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var vH:ViewHolder ?= null
var view:View?=null
if (convertView == null){
vH = ViewHolder()
view = View.inflate(context,R.layout.camera_list_item,null);
vH.item_name = view.findViewById(R.id.item_name);
vH.item_status = view.findViewById(R.id.item_status)
view.tag = vH
}else{
view = convertView
vH = view.tag as ViewHolder
}
Log.d("dwgewrgheh",list.size.toString()+"aa")
vH?.item_name!!.setText(list.get(position).getCameraName())
if (list.get(position).getCameraStatus() == 1)
vH?.item_status!!.setText("在线")
else
vH?.item_status!!.setText("离线")
return view!!
}
inner class ViewHolder{
var item_name: TextView?=null
var item_status:TextView?=null
}
override fun getItem(position: Int): Any {
return list.get(position)
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getCount(): Int {
return list.size
}
}
其中,ViewHolder类用于存储控件类型。以该例子来说,ViewHolder内包含了两个可空的TextView。
至此,Adapter已经设置好了。
然后在MainActivity内。
listView.adapter = CameraAdapter(this@MainActivity,cameraList)
listView.setOnItemClickListener(object : AdapterView.OnItemClickListener{
override fun onItemClick(
parent: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
if (cameraList.get(position).getCameraStatus() == 1){
var intent = Intent(this@MainActivity,RealPlayActivity::class.java)
var bundle = Bundle()
bundle.putString("serialNo",cameraList.get(position).getCameraSN())
intent.putExtras(bundle)
startActivity(intent)
}
}
})
设置好listview 的 item监听。如果获取到的在线状态为在线,则进入播放页面。