传递给自定义视图的标记文本的值错误

Wrong value for marker text passed to custom view

我正在开发一个显示地图的 android 应用程序。加载时,它会显示一些地址并为它们设置标记。

当我点击任何标记时,它应该会在自定义视图中显示一个值。但是从 json 解析器接收到的自定义文本得到一个空值。当我再次点击标记时,它设置了正确的值。

当我点击第二个标记时,它显示第一个标记值。当我再次点击第二个标记时,它显示正确的值。这个过程继续

这是我的代码:

    private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{
        private Context mainContxt;
        Geocoder geocoder;
        public GeocoderTask(Context con){
        mainContxt=con;

        } 

        @Override
        protected List<Address> doInBackground(String... locationName) {
             Geocoder geocoder = new Geocoder(mainContxt);
                List<Address> addresses = null;
                try {
                    addresses = geocoder.getFromLocationName(locationName[0],1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return addresses;
        }


        @Override
        protected void onPostExecute(List<Address> addresses) { 

       for(int i=0;i<addresses.size();i++){             

                Address address = (Address) addresses.get(i);
                latLng = new LatLng(address.getLatitude(), address.getLongitude());

                String addressText = String.format("%s, %s",
                        address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
                        address.getCountryName());

                markerOptions = new MarkerOptions();
                markerOptions.position(latLng);
                markerOptions.title(addressText);
                if(i==0)    {
                    googleMap.animateCamera(CameraUpdateFactory.zoomBy(14),2000,null);
                    googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); 
                }
                googleMap.addMarker(markerOptions);

            }
       googleMap.setOnMarkerClickListener(new OnMarkerClickListener() {

            @Override
            public boolean onMarkerClick(Marker marker_address) {
                    location=marker_address.getTitle();
                    Toast.makeText(getApplicationContext(),location, Toast.LENGTH_LONG).show();
                new LoadSingleProperty().execute();
                //new LoadImage().execute();
                return false;

            }
        });

        googleMap.setInfoWindowAdapter(new InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker arg0) {
                return null;
            }
            @Override
            public View getInfoContents(Marker marker) {

                View myContentView = getLayoutInflater().inflate(
                        R.layout.custom_marker, null);
                tempnew_price=getPrice(temptotal_price+"" +email);
                TextView tvTitle = ((TextView) myContentView
                        .findViewById(R.id.title));
               // tvTitle.setText(location);
                tvSnippet = ((TextView) myContentView
                        .findViewById(R.id.snippet));

               ivProperty = ((ImageView) myContentView
                        .findViewById(R.id.image_property));

               tvTitle.setText(tempcovered_area+ " "+tempnew_price+System.getProperty("line.separator")+templocation);

               tvSnippet.setText("A "+ tempbedroom + " "+tempproperty_type);


              // new LoadImage().execute();
            ivProperty.setImageBitmap(bmp); 
                    return myContentView;


            }
        });
        googleMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

            @Override
            public void onInfoWindowClick(Marker arg0) {
                Intent intent = new Intent(getBaseContext(),
                        search_property_activity.class);
                intent.putExtra("Email", email);
                startActivity(intent);
            }
        });
    }
    }

这是我的加载单class编码.....

    class LoadSingleProperty extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivityMap.this);
            pDialog.setMessage("Loading Location. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
        protected String doInBackground(String... args) {
                List<NameValuePair> params = new ArrayList<NameValuePair>();
            if(location!=null && !location.equals("")){
                params.add(new BasicNameValuePair("Location", location));
                json= jsonParser.makeHttpRequest(url_loc_address, "GET", params);
            }
            Log.d("MyLocation: ", json.toString());

            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    address = json.getJSONArray(TAG_ALL_ADDRESS);
                    //for (int i = 0; i < address.length(); i++) {
                        JSONObject c = address.getJSONObject(0);
                        templocation = c.getString(TAG_LOCATION);
                        tempcovered_area=c.getString(TAG_COVERED_AREA);
                        temptotal_price=c.getString(TAG_Total_Price);

                        tempbedroom=c.getString(TAG_BEDROOM);
                        tempproperty_type=c.getString(TAG_PROPERTY_TYPE);
                        tempemail=c.getString(TAG_EMAIL);
                        //} 
                } else {

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }



    protected void onPostExecute(String file_url) {
        pDialog.dismiss();  
        new GeocoderTask(MainActivityMap.this).execute(location);
        }


    }

帮帮我朋友...提前谢谢

private class GeocoderTask extends AsyncTask<String, Void, List<Address>> {
    private Context mainContxt;
    Geocoder geocoder;

    public GeocoderTask(Context con) {
        mainContxt = con;

    }

    @Override
    protected List<Address> doInBackground(String... locationName) {
        Geocoder geocoder = new Geocoder(mainContxt);
        List<Address> addresses = null;
        try {
            addresses = geocoder.getFromLocationName(locationName[0], 1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return addresses;
    }

    @Override
    protected void onPostExecute(List<Address> addresses) {

        for (int i = 0; i < addresses.size(); i++) {

            Address address = (Address) addresses.get(i);
            latLng = new LatLng(address.getLatitude(),
                    address.getLongitude());

            String addressText = String.format(
                    "%s, %s",
                    address.getMaxAddressLineIndex() > 0 ? address
                            .getAddressLine(0) : "", address
                            .getCountryName());

            markerOptions = new MarkerOptions();
            markerOptions.position(latLng);
            markerOptions.title(addressText);
            if (i == 0) {
                googleMap.animateCamera(CameraUpdateFactory.zoomBy(14),
                        2000, null);
                googleMap.animateCamera(CameraUpdateFactory
                        .newLatLng(latLng));
            }
            googleMap.addMarker(markerOptions);
        }
    }
}

然后你写下面的代码

googleMap.setOnMarkerClickListener(new OnMarkerClickListener() {

    @Override
    public boolean onMarkerClick(Marker marker_address) {
        location = marker_address.getTitle();
        new LoadSingleProperty().execute();

        return false;

    }
});

采用另一个 customeWindowAdapter 或仅使用当前的并在 'LoadSingleProperty' AsyncTask 的 onPostExecute() 方法中设置它。 这将解决这个问题。 ping 这里你有任何疑问

为 LoadSingleProperty 创建构造函数

class LoadSingleProperty extends AsyncTask<String, String, String> {
    Marker mMarker;

    public LoadSingleProperty(Marker marker){
      mMarker = marker;
    }

    .
    .
    .
}

并将你的标记 object 传递给它。

new LoadSingleProperty(marker_address).execute();

解析完成后,使用标记的 setTitle() 方法设置标记的标题

mMarker.setTitle(c.getString(TAG_PROPERTY_TYPE));

您目前在哪里做这件事

tempproperty_type=c.getString(TAG_PROPERTY_TYPE);

不要忘记刷新您的信息 window 重设标题后

How to force refresh contents of the markerInfoWindow

由于您正在执行网络请求,您可能还想在此之前显示某种加载图标。

编辑:

如果您使用的是自定义标题视图,请在设置为 googleMap 的适配器之前获取对 InfoWindowAdapter object 的引用

InfoWindowAdapter infoWindowAdapter = new InfoWindowAdapter() {...

解析完成后,通过调用

获取 mMarker object 的信息 window 查看
infoWindowAdapter.getInfoWindow(mMarker);

从上面获取的视图中找到你的textView,并设置它的文本。然后通过调用 showInfoWindow() 更新信息 window.

来刷新您的信息 window

另请参考此link

The info window that is drawn is not a live view. The view is rendered as an image (using View.draw(Canvas)) at the time it is returned. This means that any subsequent changes to the view will not be reflected by the info window on the map. To update the info window later (for example, after an image has loaded), call showInfoWindow()