Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将ListView放入自定义顺序?_Android - Fatal编程技术网

Android 如何将ListView放入自定义顺序?

Android 如何将ListView放入自定义顺序?,android,Android,我正在创建一个从服务器加载数据的列表视图! 如何根据变量的值(例如double)对列表进行排序? 为了帮助你更多,该应用程序计算设备之间的距离,我希望列表从最小到最大的距离开始!这是我的密码,有什么想法吗 public class DriversList extends ListActivity{ private ProgressDialog pDialog; JSONParser jParser = new JSONParser(); ArrayList<HashMap<St

我正在创建一个从服务器加载数据的列表视图! 如何根据变量的值(例如double)对列表进行排序? 为了帮助你更多,该应用程序计算设备之间的距离,我希望列表从最小到最大的距离开始!这是我的密码,有什么想法吗

public class DriversList extends ListActivity{

private ProgressDialog pDialog;

JSONParser jParser = new JSONParser();

ArrayList<HashMap<String, String>> driversList;

private static String url_all_drivers = "http://192.168.2.4/drivers/get_all_drivers.php";//192.168.2.4 , 10.0.2.2 , taxidroid.yzi.me

private static final String TAG_SUCCESS = "success";
private static final String TAG_DRIVERSID = "drivers";

private static final String TAG_ID = "id";
private static final String TAG_EMAIL="email";
private static final String TAG_NAME = "name";
private static final String TAG_SURNAME="surname";
private static final String TAG_TELEPHONE="telephone";
private static final String TAG_PLATE="plate";
private static final String TAG_CARMODEL="carmodel";
private static final String TAG_LATITUDE="latitude";
private static final String TAG_LONTITUDE="lontitude";
private static final String TAG_AVAILABLE="available";
private static final String DISTANCE="distance";
private static final String MILL="hh";
private double Clat,Clon;

 JSONArray drivers = null;
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.drivers_list_layout);


 driversList=new ArrayList<HashMap<String,String>>();
 new LoadAllDrivers().execute();

Clat=getIntent().getExtras().getDouble("ClLat");
Clon=getIntent().getExtras().getDouble("ClLon");    
Toast.makeText(getBaseContext(), ""+Clat+""+Clon, Toast.LENGTH_LONG).show();
 }
class LoadAllDrivers extends AsyncTask<String, String, String>{

@Override
protected void onPreExecute() {
    super.onPreExecute();
    pDialog = new ProgressDialog(DriversList.this);
    pDialog.setMessage("Loading products. Please wait...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    pDialog.show();}


@Override
protected String doInBackground(String... args) {
      List<NameValuePair> params = new ArrayList<NameValuePair>();

      JSONObject json = jParser.makeHttpRequest(url_all_drivers, "GET", params);
      Log.d("All Drivers: ", json.toString());

     try {
           int success = json.getInt(TAG_SUCCESS);
               if (success == 1) {

                   drivers = json.getJSONArray(TAG_DRIVERSID);


             for (int i = 0; i < drivers.length(); i++) {
                 JSONObject c = drivers.getJSONObject(i);


                 String id = c.getString(TAG_ID);
                 String email=c.getString(TAG_EMAIL);
                 String name = c.getString(TAG_NAME);
                 String surname=c.getString(TAG_SURNAME);
                 String telephone=c.getString(TAG_TELEPHONE);
                 String plate=c.getString(TAG_PLATE);
                 String carmodel=c.getString(TAG_CARMODEL);
                 double lat=c.getDouble(TAG_LATITUDE);
                 double lon=c.getDouble(TAG_LONTITUDE);
                 String avail=c.getString(TAG_AVAILABLE);

                 double R = 6371; // earth’s radius (mean radius = 6,371km)
                 double dLat =  Math.toRadians(Clat-lat);

                 double dLon =  Math.toRadians(Clon-lon); 
                 double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                        Math.cos(Math.toRadians(Clat)) * Math.cos(Math.toRadians(lat)) * 
                        Math.sin(dLon/2) * Math.sin(dLon/2); 
                 double c1 = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
                 double d = R * c1;

                 double gg=d*1000;


                 HashMap<String, String> map = new HashMap<String, String>();


                 map.put(TAG_ID, id);
                 map.put(TAG_NAME, name);
                 map.put(TAG_SURNAME, surname);
                 map.put(TAG_CARMODEL, carmodel);

                 if (d<1) {map.put(DISTANCE,String.format("%.2f", gg)); map.put(MILL, "m"); }
                 else  {map.put(DISTANCE, String.format("%.2f", d)); map.put(MILL, "km"); }
                 driversList.add(map);



             }
         } else {runOnUiThread(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(DriversList.this,"Αυτη τη στιγμη δεν υπαρχει διαθεσιμος οδηγος",Toast.LENGTH_SHORT).show();}});
         }
     } catch (JSONException e) {
         e.printStackTrace();
     }
    return null;
}

@Override
protected void onPostExecute(String file_url) {
pDialog.dismiss();
runOnUiThread(new Runnable() {

    public void run() {
        /**
         * Updating parsed JSON data into ListView
         * */
        ListAdapter adapter = new SimpleAdapter(
                DriversList.this, driversList,
                R.layout.list_item, new String[] { TAG_ID,
                        TAG_NAME,TAG_SURNAME,TAG_CARMODEL,DISTANCE,MILL},
                new int[] { R.id.id, R.id.name,R.id.surname,R.id.carmodel,R.id.txtdistance1,R.id.txtmorkm});

        setListAdapter(adapter);


    }
});

}

   }

     }    
公共类驱动程序列表扩展了ListActivity{
私人对话;
JSONParser jParser=新的JSONParser();
ArrayList驱动列表;
专用静态字符串url\u所有\u驱动程序=”http://192.168.2.4/drivers/get_all_drivers.php“;//192.168.2.4,10.0.2.2,taxidroid.yzi.me
私有静态最终字符串标记_SUCCESS=“SUCCESS”;
私有静态最终字符串标记_DRIVERSID=“drivers”;
私有静态最终字符串标记\u ID=“ID”;
私有静态最终字符串标记\u EMAIL=“EMAIL”;
私有静态最终字符串标记_NAME=“NAME”;
私有静态最终字符串标记_姓氏=“姓氏”;
专用静态最终字符串标记_TELEPHONE=“TELEPHONE”;
专用静态最终字符串标签\u PLATE=“PLATE”;
私有静态最终字符串标记\u CARMODEL=“CARMODEL”;
私有静态最终字符串标记_LATITUDE=“LATITUDE”;
私有静态最终字符串标记_LONTITUDE=“LONTITUDE”;
私有静态最终字符串标记_AVAILABLE=“AVAILABLE”;
私有静态最终字符串距离=“距离”;
专用静态终轧管磨机=“hh”;
二等兵,克隆;
JSONArray驱动程序=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
setContentView(R.layout.drivers\u list\u布局);
driversList=newarraylist();
新建LoadAllDrivers().execute();
Clat=getIntent().getExtras().getDouble(“ClLat”);
Clon=getIntent().getExtras().getDouble(“ClLon”);
Toast.makeText(getBaseContext(),“”+Clat+“”+Clon,Toast.LENGTH_LONG).show();
}
类LoadAllDrivers扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=newprogressdialog(DriversList.this);
pDialog.setMessage(“正在加载产品。请稍候…”);
pDialog.setUndeterminate(假);
pDialog.setCancelable(假);
pDialog.show();}
@凌驾
受保护的字符串doInBackground(字符串…args){
List params=new ArrayList();
JSONObject json=jParser.makeHttpRequest(url_all_驱动程序,“GET”,参数);
Log.d(“所有驱动程序:,json.toString());
试一试{
int success=json.getInt(TAG_success);
如果(成功==1){
drivers=json.getJSONArray(TAG_DRIVERSID);
对于(int i=0;i如果(d您应该对ListView适配器进行子类化。这里创建一个排序函数。任何排序算法都应该这样做。然后将您的项目添加到适配器,对它们进行排序,最后将适配器设置到ListView。

ListView与否在这里并不重要。您应该做的只是在将数据处理到ListView之前对数据进行排序。

首先,为什么不创建一个类来表示驱动程序数据,而不是使用HashMap

无论如何,您要寻找的可以通过使用来完成,您需要做的是:

  • 创建一个实现接口的类

    public class DriverComparator implements Comparator<HashMap<String, String>> {
    
    public int compare(HashMap<String, String> o1,
            HashMap<String, String> o2) {
        double distance1 = -1;
        double distance2 = -1;
        try {
        distance1 = Double.parseDouble(o1.get("DISTANCE"));
        } catch (NumberFormatException ex){
    
        } catch (NullPointerException nex){
    
        }
        try {
            distance2 = Double.parseDouble(o1.get("DISTANCE"));
            } catch (NumberFormatException ex){
    
            } catch (NullPointerException nex){
    
            }
        if (distance1 == distance2){
            return 0;
        }
        if (distance1 > distance2) {
            return 1;
        }
        return -1;
    }
    

这是一个关于比较器的好教程:

在插入listview之前,您需要对数据进行排序。谢谢您的帮助!我如何创建一个类而不是HashMap?这样做的好处是什么?可能是个愚蠢的问题,但我在开发方面是新手。以及
 Collections.sort(list, new DriverComparator());