实现对收藏点的删除,跳转地图上对应收藏点的操作
新建一个Activity,其布局很简单
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_favo"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.kowalski.FavoActivity">
<android.support.v7.widget.RecyclerView
android:focusable="true"
android:focusableInTouchMode="true"
android:id="@+id/activity_favo_address_rv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/activity_favo_address_tv_delAll"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"/>
<TextView
android:id="@id/activity_favo_address_tv_delAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:drawableStart="@mipmap/ic_del_all"
android:gravity="center"
android:padding="10dp"
android:layout_alignParentBottom="true"
android:text="清空"/>
</RelativeLayout>
列表呈现所有收藏的点,清空将删除所有收藏的点。
FavoriteManager.getInstance().init(); // 初始化收藏夹
在OnCreate中,初始化收藏夹,接下来初始化其他:
initWidget();
/**
* 初始化控件
*/
private void initWidget()
{
rv_list = (RecyclerView)findViewById(R.id.activity_favo_address_rv_list);
rv_list.setHasFixedSize(true);
rv_list.setLayoutManager(new LinearLayoutManager(this));
rv_list.setItemAnimator(new DefaultItemAnimator());// 设置item动画
tv_delAll = (TextView)findViewById(R.id.activity_favo_address_tv_delAll);
}
接下来就要将数据源放到适配器里:
/**
* 加载数据
*/
private void loadData()
{
list = FavoriteManager.getInstance().getAllFavPois(); // 得到收藏点的对象
mAdapter = new FavoriteAdapter(activity, list);
rv_list.setAdapter(mAdapter);
}
适配器的代码比较简单,用两个接口实现了点击和删除的操作,就是有关RecyclerView的用法,看不懂的请百度
package com.kowalski;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.baidu.mapapi.favorite.FavoritePoiInfo;
import java.util.List;
/**
* 我的收藏适配器
* Created by kowal on 2016/11/23.
*/
public class FavoriteAdapter extends RecyclerView.Adapter<FavoriteAdapter.MyViewHolder>
{
private List<FavoritePoiInfo> list;
private Context context;
private LayoutInflater mInflater;
private FavoAdapterClick listener = null;
public interface FavoAdapterClick
{
void onItemClick(View view, int position);
void onDelClick(View view, String currentId);
}
public void setOnItemClickLitener(FavoAdapterClick mOnItemClickLitener )
{
this.listener = mOnItemClickLitener;
}
public void removeData(int position)
{
list.remove(position);
notifyItemRemoved(position);
}
public FavoriteAdapter(Context context, List<FavoritePoiInfo> list )
{
mInflater = LayoutInflater.from(context);
this.context = context;
this.list = list;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
MyViewHolder holder = new MyViewHolder(mInflater.inflate(
R.layout.item_favo_adapter, parent, false));
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position)
{
holder.tv_title.setText(list.get(position).getPoiName());//为控件绑定数据
if (null != listener)
{
final int pos = holder.getLayoutPosition();
holder.itemView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
listener.onItemClick(holder.itemView, pos);
}
});
holder.iv_del.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
listener.onDelClick(v, list.get(pos).getID());
removeData(pos);
}
});
}
}
@Override
public int getItemCount()
{
return list == null ? 0 : list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder
{
TextView tv_title;
ImageView iv_del;
public MyViewHolder(final View itemView)
{
super(itemView);
tv_title = (TextView) itemView.findViewById(R.id.item_favo_tv_title);
iv_del = (ImageView) itemView.findViewById(R.id.item_favo_iv_del);
}
}
}
// item
<?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="wrap_content"
android:background="@android:color/white"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/item_favo_tv_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="10dp"
android:textSize="18sp"/>
<ImageView
android:id="@+id/item_favo_iv_del"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:src="@mipmap/ic_del_all"/>
</LinearLayout>
接下来,在Activity中实现点击事件
private void setAction()
{
// 适配器点击事件
mAdapter.setOnItemClickLitener(new FavoriteAdapter.FavoAdapterClick()
{
@Override
public void onItemClick(View view, int position)
{
// 跳转到地图Activity并将收藏点的ID传入
startActivity(new Intent(activity, MainActivity.class)
.putExtra("locationInfo", list.get(position).getID()));
}
@Override // 删除
public void onDelClick(View view, String currentId)
{
deleteOneClick(currentId);
}
});
// 清空全部
tv_delAll.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
delFavo();
}
});
}
删除的方法如下:
/**
* 删除一个指定点
*/
private void deleteOneClick(String currentId)
{
if (FavoriteManager.getInstance().deleteFavPoi(currentId))
{
Toast.makeText(activity, "删除点成功" , Toast.LENGTH_SHORT);
mAdapter.notifyDataSetChanged();
} else
{
Toast.makeText(activity, "删除点失败" , Toast.LENGTH_SHORT);
}
}
/**
* 删除所有收藏的点
*/
private void delFavo()
{
if (FavoriteManager.getInstance().clearAllFavPois())
{
Toast.makeText(activity, "全部删除成功" , Toast.LENGTH_SHORT);
list = FavoriteManager.getInstance().getAllFavPois();
mAdapter = new FavoriteAdapter(activity, list);
rv_list.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged(); // 刷新数据
} else
{
Toast.makeText(activity, "删除失败,请稍后再试" , Toast.LENGTH_SHORT);
}
}
将收藏点的ID传入,然后调用API的deleteFavPoi方法,其返回值是一个boolean类型,做个简单的判断,然后更新适配器,就完成了。
接下来,我们要实现
// 跳转到地图Activity并将收藏点的ID传入
startActivity(new Intent(activity, MainActivity.class)
.putExtra("locationInfo", list.get(position).getID()));
这段代码。
在清单文件中为MainActiivty添加属性:android:launchMode="singleTask"
确保它会执行onNewIntent方法。
我们在startActivity方法的时候,将收藏点的ID传了过来,因此,在MainActivity中的OnNewIntent方法中,我们这样做:
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
mBaiduMap.clear();
List<FavoritePoiInfo> list = FavoriteManager.getInstance().getAllFavPois();
if (intent.getStringExtra("locationInfo") != null)
{
String id = intent.getStringExtra("locationInfo");
for (int i = 0; i < list.size(); i++)
{
if (list.get(i).getID().equals(id) || id == list.get(i).getID() )
{
Logger.w("接受到的id是" , list.get(i).getPt().toString() + "" );
MarkerOptions option = new MarkerOptions().icon(mFavoIcon).position(list.get(i).getPt());
mFavoAlMarker = ((Marker) mBaiduMap.addOverlay(option));
// 获取经纬度
LatLng latLng = new LatLng(list.get(i).getPt().latitude, list.get(i).getPt().longitude);
// 设置地图中心点以及缩放级别
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 15);
mBaiduMap.animateMapStatus(mapStatusUpdate);
}
}
}
在方法中我们接收到ID,使用循环获取ID对用的收藏点的对象,然后在地图上将收藏点显示出来。
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 15);
mBaiduMap.animateMapStatus(mapStatusUpdate);
这段代码的意思是,将收藏点的经纬度作为中心,并移动到这个坐标点。这样,收藏点就完成了。如果需要额外的marker点击事件,可以使用MarkerOptions的extraInfo方法,将bundle传入收藏点。
文章到此为止就实现了全部功能,如果对你有帮助请点赞。有疑问请留言,。。
Demo地址:
http://download.csdn.net/detail/u012552275/9694853