android - RecyclerView OnClick 通过 intent 长按添加标记到 map

标签 android google-maps android-recyclerview

最初,我有一个 ListView 为我完成这项工作,我会在 onCreate 主类中如下设置 clicklistener 和 long licklistener:

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent i = new Intent(getApplicationContext(), UserFeed.class);
            i.putExtra("venueName", businessList.get(position).name);
            i.putExtra("companyId",businessList.get(position).id);
            i.putExtra("canWrite", checkedIn);
            i.putExtra("Lat",businessList.get(position).anchorpt.getLatitude());
            i.putExtra("Lon",businessList.get(position).anchorpt.getLongitude());
            i.putExtra("NotType",venueType);
            startActivity(i);

        }
    });

    listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long l) {
            Double Lat = businessList.get(position).anchorpt.getLatitude();
            Double Lon = businessList.get(position).anchorpt.getLongitude();
            ArrayList<Marker> markers = new ArrayList<>();
            LatLngBounds.Builder builder = new LatLngBounds.Builder();
            mMap.clear();
            markers.add(mMap.addMarker(new MarkerOptions().position(new LatLng(point.getLatitude(), point.getLongitude()))
                    .icon(BitmapDescriptorFactory.defaultMarker())
                    .title("My Location")
                    .visible(false)));
            markers.add(mMap.addMarker(new MarkerOptions().position(new LatLng(Lat, Lon))
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
                    .visible(true)));

            for (Marker marker : markers){
                builder.include(marker.getPosition());
            }
            LatLngBounds bounds = builder.build();
            int padding = 100;
            CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds,padding);
            mMap.animateCamera(cu);
            return true;
        }
    });

我正在尝试对 recyclerview 执行相同的方法,但没有成功。我可以在 recylcerviewadapter 中完成,但我不确定如何添加标记。它看起来像这样:

 public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{
    public TextView tvName,tvDistance,tvAgeRange,tvUserCount,tvGenderRatio,tvTimeDetails;

    public ViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        //itemView.setOnLongClickListener(this);

        tvName = (TextView) itemView.findViewById(R.id.venueName);
        tvDistance = (TextView) itemView.findViewById(R.id.textDistance);
        tvAgeRange = (TextView) itemView.findViewById(R.id.textAgeRange);
        tvUserCount = (TextView) itemView.findViewById(R.id.textUserCount);
        tvGenderRatio = (TextView) itemView.findViewById(R.id.textGenderRatio);
        tvTimeDetails = (TextView) itemView.findViewById(R.id.whenLitOccurs);
    }


    @Override
    public void onClick(View view) {
        //context.startActivity(new Intent(context, UserFeed.class));
        int row = getAdapterPosition();
        Log.i("AppInfo","Item clicked"+ items.get(row));
        Intent i = new Intent(context, UserFeed.class);
        i.putExtra("venueName", items.get(row).name);
        i.putExtra("companyId",items.get(row).id);
        //i.putExtra("canWrite", checkedIn);
        i.putExtra("Lat",items.get(row).anchorpt.getLatitude());
        i.putExtra("Lon",items.get(row).anchorpt.getLongitude());
        //i.putExtra("NotType",venueType);
        context.startActivity(i);

    }

    @Override
    public boolean onLongClick(View view) {
        //Add a marker to map
        return true;
    }
}

我正在使用谷歌地图 v2。

最佳答案

不要在 adapter 中执行任何密集操作,而是使用回调方法(例如:接口(interface))将点击和长按事件传输到 mainactivity

第 1 步:为 clickListener 创建接口(interface)。

public interface CustomAdapterClickListener {
public void onItemClick(View v, int position);}

第 2 步:在 recylcerview 的构造函数的帮助下,将 MainActivity 引用分配给接口(interface)。

public class RecylcerAdapter  extends extends RecyclerView.Adapter<>{
public RecylcerAdapter(Context context, ArrayList<> list,
                       final CustomAdapterClickListener clickListener) {

    this.context = context;
    inflator = LayoutInflater.from(context);
    this.list = list;
    this.clickListener = clickListener;
}

}第三步:在adapter的onClicks方法中调用该接口(interface)方法

@Override
public void onClick(View v) {
    clickListener.onItemClick(v,(int)v.getTag());
}

第四步:在MainActivity中实现接口(interface)

public class MaiActivity extends AppCompatActivity implements CustomAdapterClickListener{

@Override
public void onItemClick(View v, int position) {
    // now you have the list item position as well as view , get the adapter data based on the postion
    // add marker with the help of googlemap instance .()
}

关于android - RecyclerView OnClick 通过 intent 长按添加标记到 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40458919/

相关文章:

android - 如何在谷歌地图标记上附加 TextView

android - RecyclerView 中 onBindView 上的 setAlpha() 在首次显示时不起作用

android - 根据线程 id 过滤 adb logcat 的输出

android - 为什么 MaterialButton 文本不包含完整空间?

google-maps - 如何使用单独的按钮触发Google Maps全屏模式?

java - 使用数组[]在谷歌地图上绘制多边形 - Android

Android:v7 支持 lib 27.1.0 "Program type already present"android.support.v7.recyclerview.extensions.ListAdapter 的编译错误

android - 更改 View 在 recyclerview 的所有项目中的可见性

android - 尝试向 ListView 添加页脚时出现 ClassCastException

android - 无法获取主题属性引用以在 android 中工作