Google Maps and RecyclerView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google Maps and RecyclerView相关的知识,希望对你有一定的参考价值。

我对android Studio来说还很陌生,因此为菜鸟的错误道歉。我正在使用Google Map SDK制作一个Android应用程序,并希望使用RecyclerView保存旧的搜索,一旦单击旧的保存位置,它将放大到该位置。但是,我在editText框中的输入没有保存到RecyclerView中。

编辑:显然,使用ListView是完成此任务的简便方法,我从未使用过

这是我的主班:

public class MapsActivity extends AppCompatActivity
implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener
{

  public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
  GoogleMap mGoogleMap;
  SupportMapFragment mapFrag;
  LocationRequest mLocationRequest;
  GoogleApiClient mGoogleApiClient;
  Location mLastLocation;
  Marker mCurrLocationMarker;
  EditText editText;
  Button searchLocation;
  Geocoder geocoder;
  List<Address> addresses = new ArrayList<>();
  double lat, lng;
  //ArrayList<Address> address;



  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    editText = findViewById(R.id.editText);
    searchLocation = findViewById(R.id.searchLocation);

    RecyclerView recycler_view = (RecyclerView) findViewById(R.id.recycler_view) ;
    MyAdapter myAdapter = new MyAdapter((ArrayList<Address>) addresses);
    recycler_view.setAdapter(myAdapter);


    mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFrag.getMapAsync(this);
    geocoder = new Geocoder(this, Locale.getDefault());

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
      mGoogleMap = googleMap;
      mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

      //Initialize Google Play Services
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
      {
          if (ContextCompat.checkSelfPermission(this,
                 android.Manifest.permission.ACCESS_FINE_LOCATION)
                 == PackageManager.PERMISSION_GRANTED) {
              buildGoogleApiClient();
              mGoogleMap.setMyLocationEnabled(true);   }

      } else {
          buildGoogleApiClient();
          mGoogleMap.setMyLocationEnabled(true);
        }

      searchLocation.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
            try {
                   addresses = geocoder.getFromLocationName(editText.getText().toString(), 1);
                } catch (IOException e) {
                e.printStackTrace();
                }

                if (addresses.size()>0) {
                   Address address = addresses.get(0);
                   LatLng latLng = new LatLng(address.getLatitude(), address.getLongitude());
                   mGoogleMap.addMarker(new MarkerOptions().position(latLng).title(String.valueOf(searchLocation)));
                   mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15));
                }
                else{
                   Toast.makeText(getApplicationContext(),"Invalid Address!",Toast.LENGTH_SHORT).show();
                }
             }
          });
        }

         protected synchronized void buildGoogleApiClient() 
         {
             mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
             mGoogleApiClient.connect();
         }

         @Override
         public void onConnected(Bundle bundle) {
           mLocationRequest = new LocationRequest();
           mLocationRequest.setInterval(1000);
           mLocationRequest.setFastestInterval(1000);
           mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
           if (ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
              LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);}

     }

     @Override
     public void onConnectionSuspended(int i) {
     }

     @Override
     public void onConnectionFailed(ConnectionResult connectionResult) {
     }

     @Override
     public void onLocationChanged(Location location) {
        mLastLocation = location;
        if (mCurrLocationMarker != null) {
        mCurrLocationMarker.remove();
      }
   }
}

这是我的适配器类:

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private ArrayList<MarkerOptions> markerList;
private LayoutInflater mInflater;
private static itemClickListener listener;  //Listener object, using the interface

public MyAdapter(ArrayList<Address> addresses) {
}


//Create an interface used for creating a click listener
//Reference: https://stackoverflow.com/questions/24471109/recyclerview-onclick/26196831#26196831
public interface itemClickListener{
    public void onItemClick(View v, int pos);
}


//Provides a reference to the views for each data item - View holder
public static class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView editText;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        editText = itemView.findViewById(R.id.editText);

        //Override the click listener for listening to each click on the root view of the item(main activity)
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Acquires the position of the click on the root view
                int position = MyViewHolder.super.getAdapterPosition();

                //Trigger callback
                listener.onItemClick(v, position);
            }
        });

    }
}

//Adapter Constructor
public MyAdapter(Context context, ArrayList<MarkerOptions> input, itemClickListener listen){
    mInflater = LayoutInflater.from(context);
    markerList = input;
    listener = listen;
}

//Create new views, invoked by layout manager
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    //Create new view
    View v = mInflater.inflate(R.layout.history_locations, parent,
            false);

    return new MyViewHolder(v);
}

//Replaces the content of a view, invoked by layout manager
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
    String tempTitle = markerList.get(position).getTitle();
    holder.editText.setText(tempTitle);

}

@Override
public int getItemCount() {
    return markerList.size();
}
}

和我的XML文件

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MapsActivity">

        <fragment
            xmlns:map="http://schemas.android.com/apk/res-auto"
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

            <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:orientation="horizontal">

            <EditText
                android:layout_width="248dp"
                android:layout_height="wrap_content"
                android:id="@+id/editText"
                android:layout_weight="0.5"
                android:inputType="textPersonName"
                android:hint="Search Location" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.5"
                android:id="@+id/searchLocation"
                android:text="Search" />

        </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="160dp"
        android:layout_alignParentBottom="true"
        android:background="@android:color/background_light"/>

</RelativeLayout>
答案

在您的adapter

public MyAdapter(ArrayList<Address> addresses) {

//add this
this. markerList = addresses;

}

MapsActivity

移动这些行:

MyAdapter myAdapter = new MyAdapter((ArrayList<Address>) addresses);
recycler_view.setAdapter(myAdapter);

//在您的点击监听器中

........
try {
addresses = geocoder.getFromLocationName(editText.getText().toString(), 1);
//here
MyAdapter myAdapter = new MyAdapter((ArrayList<Address>) addresses);
recycler_view.setAdapter(myAdapter);

} catch (IOException e) {
e.printStackTrace();
}
......
.......

以上是关于Google Maps and RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

Google Maps Api在重命名包名称后无法识别包名称-Android

google maps 单击标记点作为地图中心

google.maps.places.Autocomplete 语言输出

html [Google Maps]可自定义的Google Maps脚本,用于嵌入网站#js

在 maps.google.com 上的缩放比在 Google Maps API v3 上更流畅

无法通过 gradle 导入 com.google.maps.android:android-maps-utils