2013-04-08 9 views
0

У меня есть деятельность ShowList, где у меня есть поля edittext и buttons. У меня есть button "get location", который получает current location с GPS.данные о переходе между классами (не деятельности) приводит к nullpointerexception

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 в «Строка лат. .. ".

Итак, как я могу передать location от ShowList activity до adapter?

+1

Вы создаете новый объект, и я думаю, что значение по умолчанию для вашего «gps» внутри этого класса равно null. – Carnal

+0

У вас есть два класса в отдельных файлах? Или же одни и те же классы появляются в одном файле? – Carnal

+0

@Carnal: Привет, они находятся в одном проекте. Фактически, я хочу, используя активность ShowList, чтобы получить местоположение и передать эти значения моему адаптеру, чтобы использовать их. – George

ответ

2

вы не можете создании экземпляра Activity через 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); 
+0

: проблема в том, что я использую public myAdapter (контекст контекста, ArrayList ) { \t \t \t this.context = context; \t myList = list; \t} и в других действиях. И он показывает null для location.Can я избегаю этого? – George

+0

просто добавьте широту и долготу к вашему конструктору вашего адаптера, см. Мои правки – Houcine

+0

: да, я сделал это, программа запустилась, но значения, которые я получил, были нулевыми. Я использую в MainAcivity myAdapter myAdapterItems = new myAdapter ( MainActivity .this, myList); \t \t myListView.setAdapter (myAdapterItems); и когда я попытался: myAdapter myAdapterItems = новый myAdapter ( \t \t MainActivity.this, myList, lat, lo); \t \t myListView.setAdapter (myAdapterItems); (я инициализировал lat, lo) Я принял null. – George

0

Учитывая, что ShowList является видом деятельности, скорее всего, вы реализовали метод onCreate, чтобы сделать все инициализацию. Однако, когда вы создаете класс с new ShowList(), ваш метод onCreate не вызывается, вместо этого вызывается конструктор по умолчанию ShowList, если он определен. Я подозреваю, что вы его не определили, поэтому переменная-член gps равна null - в результате ваш NPE.

1

Вы не должны создавать экземпляр деятельности, как

ShowList locationclass=new ShowList(); 

Вместо этого вызовите адаптер с параметрами, которые вы хотите передать в качестве

MyAdapter myAdapter = new MyAdaper(latitude, longitude); 

И изменить конструктор MyAdapter соответственно.

Просто заметьте: не начинайте название класса с небольшой буквы. Соблюдайте правильные соглашения об именах.

Edit: (В ответ на комментарий ОП)

Если вы создаете объект класса адаптера находится в вашей деятельности 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); 
+0

: Я немного запутался прямо сейчас (извините, у меня нет большого опыта). Можете ли вы сказать мне, где именно и как реализовать myAdapter? (обратите внимание, что myAdapter theadapter = new myAdapter (..);) – George

+0

В каком классе вы вызываете myAdapter theadapter = new myAdapter (..) ;? –

+0

Я не называю его нигде. Я спрашиваю, где его использовать. Я имел в виду, что имя адаптера, которое я использую, это myAdapter.java. – George

0

Во-первых:

Мы не создаем активность в андроида как этот

ShowList locationclass=new ShowList(); 

Os создает активность Instance через его делегат при условии, как startActivity и startActivityForResult. Вы должны использовать один и тот же экземпляр для переноса ваших данных и передачи данных с той же ссылки.

И в вашем случае ваш адаптер должен нести эту оригинальную ссылку на действие.

Во-вторых.

Отслеживание местоположения GPS занимает пару секунд до нескольких минут. И когда-то это никогда не дает вам обновление местоположения в зависимости от открытого неба, доступного вашему устройству или нет. и в зависимости от некоторых других факторов окружающей среды.

Таким образом, вы должны позвонить своему адаптеру для отображения местоположения только после того, как Менеджер по местоположению уведомляет о вашей деятельности с обновлением местоположения. Вы должны запросить обновления местоположения до этого. И как только вы получите место. Отмените запрос на получение дополнительных обновлений.

Вам необходимо больше узнать о том, как работает GPS в Android и о передовых методах, связанных с ним. Надеюсь, это поможет

Смежные вопросы