SQLite填充的ListView中的Android onItemClicklistener返回ClassCastException错误

时间:2012-08-14 08:31:13

标签: android sqlite listview classcastexception onitemclicklistener

我已经被困了一天的问题,我仍然不知道该怎么做。我正在尝试在Android中制作一个Google Maps加油站查找器应用程序,在我通过其ListViewLatitude值进行映射之前,我决定先使用Longitude

我成功地使用ListView数据库中的数据填充SQLite,但我似乎无法正确使用OnItemClickListener

所以这是我的问题......

我似乎无法传递我点击的项目的LatitudeLongitude值。使用我当前的代码,每次单击某个项目时,应用程序都会关闭,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;
   }
  }

提前致谢。 :)

2 个答案:

答案 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>