java - 在 ListView 项目上单击,将 Google Map 相机移动到指定标记
问题描述
我有一个谷歌地图活动,其中包括一个搜索框和一个交货列表视图(包含 LatLng)。当我单击列表视图内的地址时,我希望相机移动到该地址/标记(列表视图内的所有地址都被标记)。
我在我的自定义 ListAdapter 中有这个方法,我试图在其中获取更新相机,但它不起作用。这是我的代码的一部分。
public class DeliveriesListAdapter extends ArrayAdapter<Delivery> implements View.OnClickListener {
private ArrayList<Delivery> deliveries;
public DeliveriesListAdapter(ArrayList<Delivery> data, Context context) {
super(context, R.layout.activity_row_item, data);
this.deliveries = data;
this.mContext = context;
}
@Override
public void onClick(View v) {
// TODO: on click, move camera to selected address on map.
int position = (Integer) v.getTag();
Delivery delivery = (Delivery) deliveries.get(position);
CameraUpdateFactory.newLatLng(delivery.getLatLng());
}
}
这是保存指定列表项的 LatLng 的 My Data 类。
public class Delivery {
private String address;
private double distance, time;
private LatLng latLng;
private Place place;
public Delivery(Place place) {
address = place.getAddress().toString();
distance = -1;
time = -1;
latLng = place.getLatLng();
this.place = place;
}
在我的谷歌地图活动中:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback{
private ArrayList<Delivery> deliveryList = new ArrayList<>();
// called inside onCreate(...)
private void setUpListView() {
deliveriesListView = findViewById(R.id.deliveries_listview);
adapter = new DeliveriesListAdapter(addressList, this);
deliveriesListView.setAdapter(adapter);
}
/**
* Used to add Delivery to a list view.
* @param delivery The Delivery containing the address to be added to the view to add the marker.
*/
private void addDeliveryToList(Delivery delivery) {
deliveryList.add(delivery);
adapter.notifyDataSetChanged();
}
编辑:我知道那CameraUpdateFactory.newLatLng(delivery.getLatLng());
是错误的,我之前弄乱了它并删除了我原来的内容。
解决方案:我设法通过将我的自定义列表适配器重写为 RecyclerViewAdapter 来解决它,并设法将 Overriden onClick 方法移动到我的 Maps Activity,这是我遇到的麻烦。
解决方案
您还需要告诉地图移动相机。像这样mMap.moveCamera(CameraUpdateFactory.newLatLng(delivery.getLatLng()))
。还有一件事,你不应该处理适配器中的点击。它们应该包含在主机 UI 部分中。您可以使用接口在主机 UI 部分进行回调。您可以在此处获得有关如何执行此操作的提示。
推荐阅读
- c# - 将 VARCHAR 转换为 BINARY(16)
- odata - 为什么此 URI 在 OData 服务中产生运行时错误?
- scala - 将 AWS S3 对象转换为 ByteString 问题
- bash - 如何通过 find、exec 和 sed 在行前添加变量?
- c# - 如何在按钮 WPF 上使用 PI 图标
- ios - UITableView 滚动与内容触摸
- jquery - jQuery,隐藏一个前元素
- node.js - 传递给 findOne 的参数必须是选项对象,如果您希望传递单个主键值,请使用 findById 我在 Sequelize 中已完成此操作
- python - python为每一行添加数字
- actions-on-google - 如何在对话流和谷歌操作上实际设置 final_response