2012-05-31 69 views
0

我有一個ListView,其中每個條目顯示一些信息,包括用戶的當前位置和感興趣的位置之間的距離。滾動ListView laggy因爲計算位置之間的距離

不幸的是,由於我計算getView()內部的距離(通過調用距離計算方法並返回字符串來設置TextView),滾動查看列表有點遲緩。

有人可以給我一個解決方案,讓我可以在我的ListView平滑滾動嗎?

這裏是我的getView()方法:

@Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) { 
      layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      FeedViewHolder feedViewHolder = null; 
      final VideoLocationDB vidLocation = videoLocationsDB[position]; 
      String url = vidLocation.documentary_thumbnail_url; 
      String name = vidLocation.name; 
      String title = vidLocation.name; 
      String desc = vidLocation.text; 
      double lat = vidLocation.latitude; 
      double lng = vidLocation.longitude; 
      String distance = calculateDistance(lat,lng); 


      if (convertView == null) { 

       convertView = layoutInflater.inflate(R.layout.listitems, parent,false); 
       feedViewHolder = new FeedViewHolder(); 
       feedViewHolder.titleView = (TextView) convertView.findViewById(R.id.txt_title); 
       feedViewHolder.descView = (TextView) convertView.findViewById(R.id.txt_list_desc); 
       feedViewHolder.more = (TextView) convertView.findViewById(R.id.txt_more); 
       feedViewHolder.distanceView = (TextView) convertView.findViewById(R.id.txt_distance); 
       feedViewHolder.v = (ImageView) convertView.findViewById(R.id.image); 

       Typeface fontRegular = Typeface.createFromAsset(getAssets(), 
         "miso.otf"); 
       feedViewHolder.titleView.setTypeface(fontRegular); 
       Typeface fontLight = Typeface.createFromAsset(getAssets(), 
         "miso-light.otf"); 
       feedViewHolder.descView.setTypeface(fontLight); 
       feedViewHolder.more.setTypeface(fontLight); 
       feedViewHolder.distanceView.setTypeface(fontRegular); 

       convertView.setTag(feedViewHolder); 

      } else 
      { 
       feedViewHolder = (FeedViewHolder) convertView.getTag(); 
      } 


      feedViewHolder.v.setTag(url); 
      loader.DisplayImage(url, LocationsListActivity.this, feedViewHolder.v, name); 
      feedViewHolder.titleView.setText(title.toUpperCase()); 
      feedViewHolder.descView.setText(desc); 
      feedViewHolder.more.setText(getString(R.string.de_list_more)); 
      feedViewHolder.distanceView.setText(distance); 

      return convertView; 
     } 

,這裏是距離計算方法:

public double countDistance(double lat1, double lng1, double lat2, 
      double lng2) { 
     Location locationUser = new Location("point A"); 
     Location locationPlace = new Location("point B"); 
     locationUser.setLatitude(lat1); 
     locationUser.setLongitude(lng1); 
     locationPlace.setLatitude(lat2); 
     locationPlace.setLongitude(lng2); 

     double distance = locationUser.distanceTo(locationPlace); 

     return distance; 
    } 

    public String calculateDistance(double lat2, double lng2){ 

     String distance = null; 

     if (location != null) { 
      double lat = location.getLatitude(); 
      double lng = location.getLongitude(); 

      if (countDistance(lat, lng, lat2, lng2) >= 500) { 
       double kilometer = countDistance(lat, lng, lat2, lng2)/1000; 
       int decimalPlaces = 1; 
       BigDecimal decimal = new BigDecimal(kilometer); 
       decimal = decimal.setScale(decimalPlaces, 
         BigDecimal.ROUND_HALF_UP); 
       double new_km = decimal.doubleValue(); 
       distance = String.valueOf(new_km+ " km"); 
      } else { 
       int decimalPlaces = 1; 
       BigDecimal decimal = new BigDecimal(countDistance(lat, lng, 
         lat2, lng2)); 
       decimal = decimal.setScale(decimalPlaces, 
         BigDecimal.ROUND_HALF_UP); 
       double meter = decimal.doubleValue(); 
       distance = String.valueOf(meter + " m"); 
      } 
      videoLocationAdapter.notifyDataSetChanged(); 
     } 
     return distance; 
    } 
+0

你爲什麼使用BigDecimal?你計算兩個星系之間的距離嗎? – Shaiful

+0

因爲我想圍繞距離的長度,還有其他建議嗎? – hectichavana

回答

1

Greendroid(https://github.com/cyrilmottier/GreenDroid)用未來(HTTP ://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html)以列表視圖的形式從網站加載異步圖像。即使列表中包含數百個條目,它的效率也非常高。所以我認爲這是你要找的東西。期貨由執行人員管理,以便在硬件限制內完成所有操作。

一些代碼? Greendroid,這裏有一個有趣的例子,你可以找到更多的信息。這是在我的書籤,但我不知道它是否是最新的: http://blog.tomgibara.com/post/7665158012/android-adapter-view-rendering