0

私は1日問題に悩まされてきましたが、それをどうやって行うのかまだわかりません。AndroidでGoogleマップのガソリンスタンドファインダーアプリを作成しようとしていますが、マップする値とその値を渡す前に、最初に作成することにしListViewました。LatitudeLongitude

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;
   }
  }

前もって感謝します。:)

4

2 に答える 2

0

あなたのアダプターで私は以下を見つけました:

public Object getItem(int position) {
    return position;
}

このメソッドは、実際のStationオブジェクトの位置ではなく、指定された位置にある実際のオブジェクトを返す必要があります。

Stationキャスト例外は、ランタイムがオブジェクトにキャストできない int をメソッドが返しているためです。

したがって、ここで行う必要があるのは次のとおりです。

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>

于 2012-08-14T13:41:26.773 に答える
0

それを変更

Station stationList = (Station) list.getItemAtPosition(position);

LazyAdapter la = (LazyAdapter) list.getAdapter();
Station stationlist = (Station) la.getItemAtPosition(position); // *Convert HashMap to Station

*HashMap から Station に変換する必要があります。ステーション クラスを共有していただければ、お手伝いできます。

最後に、LazyAdapter クラスで、次のように getItemAtPosition(int position) メソッドを追加する必要があります。

public HashMap getItemAtPostion(int position){
     return data.get(position);
}
于 2012-08-14T08:56:36.877 に答える