为了账号安全,请及时绑定邮箱和手机立即绑定

ArcGIS Runtime For Android 开发 (7)

标签:
Android
第七课 图层管理

在前边的课程中,我们学习了如何加载图层,符号化图层,那么如果一个项目里边包含了很多的图层,但又需要进行查看特定的图层,怎么办?是的,我们需要对加载的图层进行管理。

那么如何来实现图层的管理?从地图控件中获取加载的图层,然后把图层绑定到一个列表控件上,然后点击列表控件的选项控制图层的显示和隐藏就好了。思路有了,接下来就是动手实现了。

首先呢,我们设计图层管理的布局。

<?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.绑定数据到列表控件上
在绑定的时候一定要注意解决当图层比较多的时候,用户滑动列表后,刷新状态导致的显示不正确问题。

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消