我已经被困了一天的问题,我仍然不知道该怎么做。我正在尝试在Android中制作一个Google Maps加油站查找器应用程序,在我通过其ListView
和Latitude
值进行映射之前,我决定先使用Longitude
。
我成功地使用ListView
数据库中的数据填充SQLite
,但我似乎无法正确使用OnItemClickListener
。
所以这是我的问题......
我似乎无法传递我点击的项目的Latitude
和Longitude
值。使用我当前的代码,每次单击某个项目时,应用程序都会关闭,LogCat会在工作站java.lang.ClassCastException : java.lang.Integer
上为我提供stationList = (Station) list.getItemAtPosition(position);
(请参阅OnItemClickListener
代码)。
任何人都可以帮助我从ListView
传递纬度和经度吗?谢谢,麻烦您了。 :)
NearGasActivity
public class NearGasActivity extends Activity{
static final String KEY_NAME = "search"; // parent node
static final String KEY_ID = "id";
static final String KEY_STATNAME = "name";
static final String KEY_STATLOC = "location";
static final String KEY_LATITUDE = "latitude";
static final String KEY_LONGITUDE = "longitude";
LocationManager locationManager;
Location currentLocation = null;
GeoPoint currentPoint;
DatabaseHandler db = new DatabaseHandler(this);
double latPoint;
double lonPoint;
int currLatitude;
ListView list;
LazyAdapter adapter;
List<Station> listOfStations;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nearme);
getLastLocation();
areaList(currentLocation);
}
public void areaList(Location location) {
listOfStations = db.getAllStations();
int currLatitude = (int) (location.getLatitude() * 1e6);
int currLongitude = (int) (location.getLongitude() * 1e6);
double diffLat;
double diffLon;
ArrayList<HashMap<String, String>> searchList = new ArrayList<HashMap<String, String>>();
for (Station b : listOfStations){
if ( b.getStationLocationLat() != null || b.getStationLocationLon() != null ) {
try {
latPoint = Double.parseDouble(b.getStationLocationLat());
lonPoint = Double.parseDouble(b.getStationLocationLon());
} catch (NumberFormatException e) {
}
}
diffLat = Math.abs(currLatitude - (latPoint * 1e6));
diffLon = Math.abs(currLongitude - (lonPoint * 1e6));
/* 2000 measurement units. Made-up. */
if (((diffLat) < 2000) && ((diffLon) < 2000)){
HashMap<String, String> map = new HashMap<String, String>();
map.put(KEY_ID, b.getStationCode());
map.put(KEY_STATNAME, db.getGasByCode(b.getStationGasCode()).getName());
map.put(KEY_STATLOC, b.getStationLocationDesc());
map.put(KEY_LATITUDE, b.getStationLocationLat());
map.put(KEY_LONGITUDE, b.getStationLocationLon());
songsList.add(map);
}
}
list = (ListView)findViewById(R.id.list);
adapter = new LazyAdapter(this, sList);
list.setAdapter(adapter);
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Station stationList = (Station) list.getItemAtPosition(position);
double latitude = Double.parseDouble(stationList.getStationLocationLat());
double longitude = Double.parseDouble(stationList.getStationLocationLon());
Toast toast = Toast.makeText(NearGasActivity.this, "Test Message: " + lat, Toast.LENGTH_SHORT);
toast.show();
}
});
}
LazyAdapter
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.list_row, null);
TextView name = (TextView)vi.findViewById(R.id.name); // station name
TextView location = (TextView)vi.findViewById(R.id.location); // station location address
TextView latitude = (TextView)vi.findViewById(R.id.latitude);
TextView longitude = (TextView)vi.findViewById(R.id.longitude);
HashMap<String, String> search = new HashMap<String, String>();
search = data.get(position);
// Setting all values in listview
name.setText(search.get(NearGasActivity.KEY_STATNAME));
location.setText(search.get(NearGasActivity.KEY_STATLOC));
latitude.setText(search.get(NearGasActivity.KEY_LATITUDE));
longitude.setText(search.get(NearGasActivity.KEY_LONGITUDE));
return vi;
}
}
提前致谢。 :)
答案 0 :(得分:0)
改变它
Station stationList = (Station) list.getItemAtPosition(position);
带
LazyAdapter la = (LazyAdapter) list.getAdapter();
Station stationlist = (Station) la.getItemAtPosition(position); // *Convert HashMap to Station
*您必须从HashMap转换为Station。如果你分享你的Station类,我可以帮忙。
最后在你的LazyAdapter类中,你必须像这样添加getItemAtPosition(int position)方法:
public HashMap getItemAtPostion(int position){
return data.get(position);
}
答案 1 :(得分:0)
在您的适配器中,我发现了以下内容:
public Object getItem(int position) {
return position;
}
此方法应该在提供的位置返回实际的Station
对象,而不是它的位置。
强制转换异常是因为您的方法返回一个int,运行时无法将其强制转换为Station
对象。
所以,这就是你需要做的事情:
1-将getItem(int position)
的实施更改为:
public Station getItem(int position) {
HashMap station_data = data.get(position);
Station s = new Station(station_data);
return s;
}
2-在Station
对象中实现一个构造函数,该构造函数采用HashMap<String,String>
。