0

我有一个活动ShowList,我有一些edittext领域和buttons. 我有一个buttonget location”,它得到了current locationwith GPS

ShowList activity效果很好,我可以得到location):

  public class ShowList extends Activity implements OnClickListener{


GPSTracker gps;   //i use GPSTracker to get the location (it is not an activity)
     .........

 case R.id.getlocation:
    // create class object
   gps = new GPSTracker(ShowList.this);

  // check if GPS enabled
 if(gps.canGetLocation()){

          double latitude = gps.getLatitude();
          double longitude = gps.getLongitude();

Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                    }else{
                        ...
                    }

我有一个自定义适配器

    public class myAdapter extends BaseAdapter{   
         ShowList locationclass=new ShowList();
         .....
        TextView Location = (TextView) convertView.findViewById(R.id.text_location);

            String lat=Double.toString(locationclass.gps.getLatitude());
            String lo=Double.toString(locationclass.gps.getLongitude());
            String coordinates="Lat: " + lat + "  Long: " + lo;
            Location.setText(coordinates);

我收到了nullpointer" String lat..."

那么,我怎样才能传递locationfromShowList activityadapter

4

4 回答 4

2

你不能实例Activityvia new。否则,您应该传递上下文;Adapter您的构造函数的纬度和经度:

public class myAdapter extends BaseAdapter{   
         private String latitude;
         private String longitude;
         private ArrayList<Item> items;
         private Context context; // TODO: use it for layoutInflater

        //the constructor
        public myAdapter(Context context, ArrayList<myItems> list, String latitude, String longitude) {
            this.items = list;
            this.latitude = latitude;
            this.longitude = longitude;
            this.context = context;
        }
         .....
        TextView Location = (TextView) convertView.findViewById(R.id.text_location);
            String coordinates="Lat: " + this.latitude + "  Long: " + this.longitude;
            Location.setText(coordinates);
于 2013-04-08T11:25:38.687 回答
1

您不应将活动实例创建为

ShowList locationclass=new ShowList();

相反,使用要传递的参数调用适配器

MyAdapter myAdapter = new MyAdaper(latitude, longitude);

并相应地更改构造函数MyAdapter

请注意:不要以小写字母开头类名。遵循正确的命名约定。

编辑:(回复OP的评论)

如果您在活动 ShowList.java 中创建适配器类的对象,则将调用更改为:

MyAdapter theAdapter = new MyAdaper(latitude, longitude);

并更改类MyAdapter.java如下:

public class myAdapter extends BaseAdapter{ 
    Strig latitude, longitude;  

    public MyAdapter(String lat, String long)
    {
        this.latitude=lat;
        this.longitude = long;
    }
    TextView Location = (TextView) convertView.findViewById(R.id.text_location);

    String lat=Double.toString(latitude);
    String lo=Double.toString(longitude);
    String coordinates="Lat: " + lat + "  Long: " + lo;
    Location.setText(coordinates);
于 2013-04-08T11:19:24.427 回答
0

考虑到这ShowList是一项活动,您很可能实现onCreate了所有初始化的方法。但是,当您使用 创建类时new ShowList(),不会调用您的onCreate方法,而是调用默认构造函数ShowList(如果已定义)。我怀疑你没有定义它,因此你的gps成员变量是null- 导致你的 NPE。

于 2013-04-08T11:17:32.903 回答
0

首先:

我们不会像这样在 android 中创建 Activity

ShowList locationclass=new ShowList();

Os 通过其提供的委托(如 startActivity 和 startActivityForResult)创建 Activity 实例。您必须使用相同的实例来承载数据并传递从相同引用读取的数据。

在您的情况下,您的适配器需要携带原始活动参考。

第二。

GPS位置跟踪有时需要几秒钟到几分钟。有时它永远不会根据您的设备是否可以使用开放天空来为您提供位置更新。并取决于其他一些环境因素。

因此,只有在位置管理器通过位置更新通知您的活动后,您才应该调用适配器来显示位置。不过,您必须在此之前请求位置更新。一旦你得到了位置。取消获取进一步更新的请求。

您需要更多地搜索 GPS 在 Android 中的工作原理以及与之相关的最佳实践。希望能帮助到你

于 2013-04-08T11:27:08.397 回答