綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[討論] gps 判斷距離 如何使用listview

[複製連結] 查看: 2916|回覆: 2|好評: 1
跳轉到指定樓層
樓主
u93508 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2013-8-25 00:18

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
目前他是直接textview 呈現
我想要把它改成 listview 請問大大如何修改一下程式碼謝謝




layout-main

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

    <Button
    android:id="@+id/btn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="查詢我的位置與景點距離"
    android:layout_alignParentBottom="true"
    />
   
    <TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/btn"
    android:gravity="center_vertical|left"
    />

</RelativeLayout>







MainActivity.java



package com.dean.demo.location;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity
{
        //宣告定位管理控制
        private LocationManager mLocationManager;
        //建立List,屬性為Poi物件
        private ArrayList<Poi> Pois = new ArrayList<Poi>();
        //TextView元件
        private TextView mText;
        //String字串
        private String TEXT;
        //設定距離範圍
        private int DISTANCE = 50000;
       
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
   
             //建立物件,並放入List裡 (建立物件需帶入名稱、緯度、經度)
                  Pois.add(new Poi("台北車站" , 25.04661 , 121.5168 ));
             Pois.add(new Poi("台中車站" , 24.13682 , 120.6850 ));
             Pois.add(new Poi("台北101" , 25.03362 , 121.56500 ));
             Pois.add(new Poi("高雄85大樓" , 22.61177 , 120.30031 ));
             Pois.add(new Poi("九份老街" , 25.10988 , 121.84519 ));
        
                   //取得定位權限
                   mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
     
             //取得在Layout建立的Button元件
             Button btn = (Button) findViewById(R.id.btn);
             //取得在Layout建立的TextView元件
             mText = (TextView) findViewById(R.id.text);
            
                //Button按下觸發Listener
             btn.setOnClickListener(new OnClickListener()
             {
                        @Override
                        public void onClick(View v)
                        {
                                //按下按鈕後讀取我的位置,定位抓取方式為網路讀取(若欲以GPS為定位抓取方式則更改成LocationManager.GPS_PROVIDER),最後則帶入定位更新Listener。
                                mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange);
                        }
             });
        }

        //更新定位Listener
        public LocationListener LocationChange = new LocationListener()
        {
                public void onLocationChanged(Location mLocation)
                {         
                        for(Poi mPoi : Pois)        
                        {
                                //for迴圈將距離帶入,判斷距離為Distance function,需帶入使用者取得定位後的緯度、經度、景點店家緯度、經度。
                                mPoi.setDistance(Distance(mLocation.getLatitude(),mLocation.getLongitude(),mPoi.getLatitude(),mPoi.getLongitude()));
                }
                       
                        //依照距離遠近進行List重新排列
                DistanceSort(Pois);

                        //印出我的座標-經度緯度
                        TEXT = "我的座標 - 經度 : " + mLocation.getLongitude() + "  , 緯度 : " + mLocation.getLatitude() ;
                       
                        //for迴圈,印出景點店家名稱及距離,並依照距離由近至遠排列,第一筆為最近的景點店家,最後一筆為最遠的景點店家
                       for(int i = 0 ; i < Pois.size() ; i++ )
                {
                               //範圍距離篩選,小於範圍內的才可以顯示
                               if(Pois.get(i).getDistance() < DISTANCE)
                               {
                                       TEXT = TEXT + "\n" + "地點 : " + Pois.get(i).getName() + "  , 距離為 : " + DistanceText(Pois.get(i).getDistance()) ;
                               }
                }
                      
                       mText.setText(TEXT);
            }
                
            public void onProviderDisabled(String provider)
            {
            }
                
            public void onProviderEnabled(String provider)
            {
            }
                
            public void onStatusChanged(String provider, int status,Bundle extras)
            {
            }
        };

        @Override
        protected void onDestroy()
        {
                super.onDestroy();
                mLocationManager.removeUpdates(LocationChange);  //程式結束時停止定位更新
        }

        //帶入距離回傳字串 (距離小於一公里以公尺呈現,距離大於一公里以公里呈現並取小數點兩位)
        private String DistanceText(double distance)
        {
                if(distance < 1000 ) return String.valueOf((int)distance) + "m" ;
                else return new DecimalFormat("#.00").format(distance/1000) + "km" ;
        }

        //List排序,依照距離由近開始排列,第一筆為最近,最後一筆為最遠
        private void DistanceSort(ArrayList<Poi> poi)
        {
                Collections.sort(poi, new Comparator<Poi>()
                {
                        @Override
                        public int compare(Poi poi1, Poi poi2)
                        {
                                return poi1.getDistance() < poi2.getDistance() ? -1 : 1 ;
                        }
                });
        }

        //帶入使用者及景點店家經緯度可計算出距離
        public double Distance(double longitude1, double latitude1, double longitude2,double latitude2)
        {
                double radLatitude1 = latitude1 * Math.PI / 180;
                double radLatitude2 = latitude2 * Math.PI / 180;
                double l = radLatitude1 - radLatitude2;
                double p = longitude1 * Math.PI / 180 - longitude2 * Math.PI / 180;
                double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(l / 2), 2)
                                 + Math.cos(radLatitude1) * Math.cos(radLatitude2)
                                 * Math.pow(Math.sin(p / 2), 2)));
                distance = distance * 6378137.0;
                distance = Math.round(distance * 10000) / 10000;
                    
                return distance ;
        }

        /*** 印出的結果為 :
              *
              * (未設定範圍距離)
              * 我的座標 - 經度 : 121.56024  , 緯度 : 25.03935
              * 地點 : 台北101  , 距離為 : 626m
              * 地點 : 台北車站  , 距離為 : 4.85km
              * 地點 : 九份老街  , 距離為 : 31.99km
              * 地點 : 台中車站  , 距離為 : 110.40km
              * 地點 : 高雄85大樓  , 距離為 : 197.37km
              *
              *
              * (設定範圍距離為50000則顯示為:)
              * 我的座標 - 經度 : 121.56024  , 緯度 : 25.03935
              * 地點 : 台北101  , 距離為 : 626m
              * 地點 : 台北車站  , 距離為 : 4.85km
              * 地點 : 九份老街  , 距離為 : 31.99km
              *
        */
}



Poi.java

package com.dean.demo.location;

//物件類別class,名稱為Poi
public class Poi
{
        private String Name;        //景點店家名稱
        private double Latitude;    //景點店家緯度
        private double Longitude;   //景點店家經度
        private double Distance;    //景點店家距離
           
        //建立物件時需帶入景點店家名稱、景點店家緯度、景點店家經度
        public Poi(String name , double latitude , double longitude)
        {
                //將資訊帶入類別屬性
                Name = name ;
                Latitude = latitude ;
                Longitude = longitude ;
        }
       
        //取得店家名稱
        public String getName()
        {
                return Name;
        }

        //取得店家緯度
        public double getLatitude()
        {
                return Latitude;
        }

        //取得店家經度
        public double getLongitude()
        {
                return Longitude;
        }
       
        //寫入店家距離
        public void setDistance(double distance)
        {
                Distance = distance;
        }
       
        //取的店家距離
        public double getDistance()
        {
                return Distance;
        }
}

以上是小黑人Android 所提供範例



「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 1碎鑽 +1 幫助 +1 收起 理由
guoty + 1 + 1 讚一個!

查看全部評分

收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
skocl | 收聽TA | 只看該作者
發表於 2013-8-26 18:01
改成listview 的用意是什麼?  你想要一列 顯示一筆資料嗎?
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
whl | 收聽TA | 只看該作者
發表於 2013-8-26 18:10
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則