0

私はListView、ユーザーの現在の場所と関心のある場所との間の距離を含むいくつかの情報を示す各エントリを持っています。

残念ながら、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;
    }   
4

1 に答える 1

1

Greendroid(https://github.com/cyrilmottier/GreenDroid)は、Future(http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html)を使用して非同期で画像をロードしていますリストビューでWebから。また、リストに数百のエントリが含まれている場合でも、非常に効率的です。だから、これはあなたが探しているようなものだと思います。先物は、すべてがハードウェアの制限内で行われるように、プールを処理するエグゼキュータによって管理されます。

いくつかのコード?Greendroidと、ここに興味深い例があり、より多くの情報を見つけることができます。それは私のブックマークにありましたが、それが最新であるかどうかはわかりません:http: //blog.tomgibara.com/post/7665158012/android-adapter-view-rendering

于 2012-05-31T10:31:27.823 に答える