在前边的课程中,我们学习了如何加载图层,符号化图层,那么如果一个项目里边包含了很多的图层,但又需要进行查看特定的图层,怎么办?是的,我们需要对加载的图层进行管理。
那么如何来实现图层的管理?从地图控件中获取加载的图层,然后把图层绑定到一个列表控件上,然后点击列表控件的选项控制图层的显示和隐藏就好了。思路有了,接下来就是动手实现了。
首先呢,我们设计图层管理的布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/overmaplyrmanage"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
接下来,我们设计列表的绑定数据项布局。在列表中当我选中或者表示显示时,有个状态,未选中或者图层隐藏时有个状态,说明我们需要一个控件来表示状态;图层的名字也需要显示,我们需要一个Text View,简单的我们就放这些,来看下代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:gravity="center_vertical"
android:layout_height="45dp"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:background="@color/colorWhite">
<ImageView
android:id="@+id/visibleCheck"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:padding="5dp"
app:srcCompat="@drawable/ic_check_box_unchecked" />
<TextView
android:id="@+id/layerText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="1234556678909"
/>
</LinearLayout>
好了,界面设计好了,那么我们将数据绑定到界面上:
var layers = mapView.layers
LyrCheckItem.ITEMS.clear()
for (i in layers.indices) {
var lyr = layers[layers.size - 1 - i]
var layername = lyr.name //图层名字逆放
var icon: Int
if (lyr.isVisible) {
icon = R.drawable.ic_check_box_checked
} else {
icon = R.drawable.ic_check_box_unchecked
}
val dummyItem = LyrCheckItem.DummyItem(i.toString() + "", layername, lyr.isVisible, icon)
LyrCheckItem.addItem(dummyItem)
}
var contentView = LayoutInflater.from(this@LandSurveryActivity).inflate(R.layout.ovmaplyr, null)
var lyrList = contentView.findViewById(R.id.overmaplyrmanage) as RecyclerView
lyrList.layoutManager = LinearLayoutManager(mContex)
lyrList.adapter = OverLayerManagerAdapter(LyrCheckItem.ITEMS, mapView)
//使用popwindow显示
var popWindow = PopupWindow()
popWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT)
popWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT)
popWindow.contentView = contentView
popWindow.update()
popWindow.setFocusable(true)
var dw = ColorDrawable(Color.WHITE)
popWindow.setBackgroundDrawable(dw)
popWindow.showAsDropDown(btnOvLryMg)
OverLayerManagerAdapter :
/**
* Created by Singfee on 2018/2/3.
*/
class OverLayerManagerAdapter(lyrList: ArrayList<LyrCheckItem.DummyItem>, mapView: MapView) : RecyclerView.Adapter<OverLayerManagerAdapter.ViewHolder>() {
private var layerList: ArrayList<LyrCheckItem.DummyItem>
private var mapView: MapView
init {
layerList = lyrList
this.mapView = mapView
}
override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
holder?.mItem=layerList[position]
holder?.tv_lyrName?.text = layerList[position].layerName
if(layerList[position].status)
holder?.image_check?.setImageResource(R.drawable.ic_check_box_checked)
else
holder?.image_check?.setImageResource(R.drawable.ic_check_box_unchecked)
holder?.view?.tag=position
holder?.itemView?.setOnClickListener { v: View? ->
val lyrs = mapView.layers
for (lyr in lyrs) {
if (lyr.name.equals(holder?.mItem?.layerName)) {
lyr.isVisible = !lyr.isVisible
holder.mItem?.status =lyr.isVisible
if (lyr.isVisible) {
holder.image_check.setImageResource(R.drawable.ic_check_box_checked)
} else {
holder.image_check.setImageResource(R.drawable.ic_check_box_unchecked)
}
}
}
}
}
override fun getItemCount(): Int {
return layerList.size
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
return OverLayerManagerAdapter.ViewHolder(LayoutInflater.from(parent?.context).inflate(R.layout.lyr_manager_item, parent, false))
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val image_check: ImageView =itemView.findViewById(R.id.visibleCheck)
val tv_lyrName: TextView =itemView.findViewById(R.id.layerText)
val view:View=itemView
var mItem: LyrCheckItem.DummyItem? = null
}
}
在界面上,打开图层管理的时候,我们不能将地图界面关闭,要实现这种有几个方式可选,使用PopupWindow,主界面相对布局中使用fragment,以及使用fragmentDialog。我这里实现的是使用的PopupWindow。
在系统中我只是简单的控制了图层的显示和隐藏,如果你有兴趣,可以对图层进行拖动排序、透明度设置等。
总结
实现图层控制的步骤有一下几个:
1.设计图层控制的界面布局
2.实现列表控件的适配器
3.绑定数据到列表控件上
在绑定的时候一定要注意解决当图层比较多的时候,用户滑动列表后,刷新状态导致的显示不正确问题。