Обновите GoogleMap на Android из ListviewAdapter

В настоящее время я создаю приложение Google Maps и пытаюсь обновить его после того, как пользователь щелкнет элемент в списке. Однако, поскольку listviewadapter находится в другой части кода, все идет не так, как планировалось. Я пробовал несколько способов, включая превращение определенных частей кода в static, однако это только нарушает код карт Google.

Вот код из моей основной деятельности, где находится карта:

public class MainActivity extends ActionBarActivity {

GoogleMap googleMap;

// products JSONArray
JSONArray locations = null;

ListView townList;
ListViewAdapter townAdapter;
String[] townID;    
String[] townName;
ArrayList<TownSelector> arraylist = new ArrayList<TownSelector>();
public static String currentLocationID;

public String getLocationID()
{
    return this.currentLocationID;
}
public static String setLocationID(String l)
{
    return currentLocationID = l;
}

public static boolean refreshMap = false;

public boolean getRefreshMap()
{
    return this.refreshMap;
}
public static boolean setRefreshMap(Boolean m)
{
    return refreshMap = m;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //setContentView(R.layout.search);  

    // Locate the ListView in listview_main.xml
    townList = (ListView) findViewById(R.id.listview);
}

private void setUpMap() {
    // enable MyLocation Layer of the Map
    googleMap.setMyLocationEnabled(true);

    // get LocationManager object from System Service LOCATION_SERVICE
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    // Create a criteria object to retrieve provider
    Criteria criteria = new Criteria();

    // Get the name of the best provider
    String provider = locationManager.getBestProvider(criteria, true);

    // Get current Location
    Location myLocation = locationManager.getLastKnownLocation(provider);

    //set map type
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    // Get lattitude of the current location
    double latitude = myLocation.getLatitude();

    //get longitude of the current location
    double longitude = myLocation.getLongitude();

    //Create a LatLong object for the current location
    LatLng latLng = new LatLng(latitude,longitude);

    // show the current location in google map
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

    // Zoom in the map
    googleMap.animateCamera(CameraUpdateFactory.zoomTo(13));
    //googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude)).title("Location").snippet("You're here"));
}

/**
 * Background Async Task to Load all product by making HTTP Request
 * */
class LoadAllInfo extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Loading Bars. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args) {
        // Building Parameters            
        List<NameValuePair> paramsLocations = new ArrayList<NameValuePair>();
        // getting JSON string from URL            
        JSONObject jsonLocations = jParser.makeHttpRequest(url_all_locations, "GET", paramsLocations);

        //Get all Locations
        if(jsonLocations != null)
        {
            // Check your log cat for JSON reponse
            Log.d("All Locations: ", jsonLocations.toString());
            try {

                // Checking for SUCCESS TAG
                int success = jsonLocations.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // products found
                    // Getting Array of Locations
                    locations = jsonLocations.getJSONArray(TAG_LOCATIONS);

                    // looping through All Offers
                    for (int i = 0; i < locations.length(); i++) {
                        JSONObject c = locations.getJSONObject(i);

                        // Storing each json item in variable
                        String id = c.getString(TAG_LID);
                        String locationName = c.getString(TAG_LNAME);

                        // creating new HashMap
                        HashMap<String, String> locationsListMap = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        locationsListMap.put(TAG_LID, id);
                        locationsListMap.put(TAG_LNAME, locationName);

                        // adding HashList to ArrayList
                        locationList.add(locationsListMap);

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

        return null;            
    } 

    }

}

}

Вот код действия ListViewAdapter:

 view.setOnClickListener(new OnClickListener() { 
        @Override
        public void onClick(View arg0) {            

            MainActivity.setLocationID(locationlist.get(position).getID());
            MainActivity.setRefreshMap(true);
        }
    });

    return view;
}

Какие-либо предложения? У меня возникает соблазн добавить функцию обновления, которая будет проверять статическое логическое значение, которое будет преобразовано из ложного в истинное, когда пользователь щелкает элемент списка, однако я считаю, что должен быть более простой способ, чем этот

РЕДАКТИРОВАТЬ: я добавил setOnItemClickListenerв основное действие и ввел строку Log.d, чтобы посмотреть, работает ли она, и я ничего не получаю после нажатия любого из четырех названий городов, которые у меня есть в списке.

    townList.setOnItemClickListener(new OnItemClickListener() {
       @Override
       public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) {
           Log.d("Hello","Why?");            
       } 
    });

person Nick Bull    schedule 27.09.2014    source источник
comment
Вы можете проверить с помощью логического флага.   -  person Piyush    schedule 27.09.2014
comment
Как я могу это сделать? В функции OnClick в lisviewadapter?   -  person Nick Bull    schedule 27.09.2014
comment
Возьмите одну общедоступную статическую логическую переменную в Map Activity и установите ее значение true при обновлении карты. И когда вы нажимаете «Просмотреть» в своем lisviewadapter, просто проверьте, верно ли это, а затем обновите карту.   -  person Piyush    schedule 27.09.2014
comment
Но как, я пробовал что-то подобное раньше, но когда я пытаюсь обновить с помощью setUpMap(); и new LoadAllInfo().execute();, он должен быть статическим, чтобы код listviewadapter мог его прочитать, но это нарушает код карт Google.   -  person Nick Bull    schedule 27.09.2014
comment
Почему бы вам не использовать setOnItemClickListener для просмотра списка из самой MainActivity.   -  person Chitrang    schedule 27.09.2014
comment
@Chitrang не думал, что это возможно, я попробую   -  person Nick Bull    schedule 27.09.2014
comment
Да, это должно сработать для вас. Дайте нам знать, если это сработало или застряло где-то поблизости.   -  person Chitrang    schedule 27.09.2014
comment
@Chitrang Я добавил обновление   -  person Nick Bull    schedule 27.09.2014
comment
Поскольку я не знаю, что находится в вашем адаптере, попробуйте удалить фокус из дочернего представления, такого как кнопки и другие, с помощью android: focusable = false. И тогда вы должны получить событие click в представлении списка.   -  person Chitrang    schedule 27.09.2014
comment
@Chitrang Вы молодец, спасибо. Чего я не сделал, так это не удалил исходный setOnClickListener из кода представления адаптера. Как только я это сделал, это сработало. Спасибо. Я собираюсь добавить это как ответ на вопрос, чтобы помочь людям в будущем. Если вы не хотите, как это было ваше предложение   -  person Nick Bull    schedule 27.09.2014
comment
Рад, что это сработало для вас. И да, продолжайте, чтобы это было полезно и другим.   -  person Chitrang    schedule 27.09.2014


Ответы (1)


Я получил исправление благодаря комментариям Читранга выше. Сначала я добавил:

townList.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) {
       Log.d("Hello","Why?");            
   } 
});

А затем, когда он упомянул, что мне нужно убрать фокус в адаптере, я понял, что не удалил предыдущий setOnClickListener, который я оставил в коде listviewadapter.

person Nick Bull    schedule 27.09.2014