当前位置 : 主页 > 手机开发 > android >

android – ListView使我的应用程序运行速度很慢,虽然我创建了Holder Class

来源:互联网 收集:自由互联 发布时间:2021-06-11
我对这个问题变得非常绝望,而且我一直在尝试你在其他线程中发布的所有想法. 问题是我的程序大量调用getView()方法,并且我实现了Holder范例,但它仍然非常慢,也许有人可以启发我? 这是
我对这个问题变得非常绝望,而且我一直在尝试你在其他线程中发布的所有想法.

问题是我的程序大量调用getView()方法,并且我实现了Holder范例,但它仍然非常慢,也许有人可以启发我?

这是我的Adapter类:

import java.util.ArrayList;

import android.content.Context;
import android.location.Location;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

    public class IconListViewAdapterPharmacy extends ArrayAdapter<PharmacyListItem> 
    {

    private ArrayList<PharmacyListItem> items;
    private Context cont;
    private Location l;

    public IconListViewAdapterPharmacy(Context cont, int textViewResourceId, ArrayList<PharmacyListItem> items, Location l)
    {
        super(cont, textViewResourceId, items);
        this.cont = cont;
        this.items = items;
        this.l = l;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View v = convertView;

        PharmacyListItem o = items.get(position);
        ViewHolder holder = new ViewHolder();

        if (v == null) 
        {
            LayoutInflater vi = (LayoutInflater)cont.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.icon_row_pharmacy, null);

            holder.tt = (TextView) v.findViewById(R.id.pharmacy_row_toptext);
            holder.address = (TextView) v.findViewById(R.id.pharmacy_row_address);
            holder.distance = (TextView) v.findViewById(R.id.pharmacy_row_distance);
            holder.telephone = (TextView) v.findViewById(R.id.pharmacy_row_telephone);

         // associate the holder with the view for later lookup
            v.setTag(holder);
        }    

        else
        {
            holder = (ViewHolder)convertView.getTag();
        }

        holder.tt.setText(o.getName());     

        String add = "" + o.getAddress();
        holder.address.setText("" + add.substring(0, add.lastIndexOf(",")));

        holder.telephone.setText("" + o.getTelephone());

        String distancia = "" + o.getDistance();

        if(l != null)
        holder.distance.setText("Distancia: " + distancia);

        return v;
    }

        static class ViewHolder 
        {
            TextView tt;
            TextView address;
            TextView distance;
            TextView telephone;
        }
    }

PharmacyListItem类:

import android.location.Location;

    public class PharmacyListItem 
    {    
private String name;
private double lat;
private double lng;
private String telephone;
private double distance;

public PharmacyListItem(Location l, String name, double lat, double lng , String telephone)
{
    this.name = name;
    this.lng = lng;
    this.lat = lat;
    this.telephone = telephone;

    Location l2 = new Location(l);

    l2.setLatitude(lat);
    l2.setLongitude(lng);

    distance = l.distanceTo(l2);
}

public String getName()
{
    return name;
}

public String getAddress()
{
    return GeoLocator.getAddress(lat, lng);
}

public String getTelephone()
{
    return telephone;
}


public String getDistance()
{
    return (""+distance).substring(0, (""+distance).indexOf(".")) + "m.";
}

public double getDist()
{
    return distance;
}

}

任何想法将不胜感激!

谢谢你们!

编辑我粘贴我的.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip"
android:layout_marginRight="4dip"
android:background="@drawable/bg_detalle_1"> 


      <ImageView
        android:id="@+id/arrow2" 
        android:layout_width="wrap_content"
        android:layout_centerVertical="true"
        android:layout_height="wrap_content" 
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"   
        android:singleLine="true"
        android:ellipsize="marquee"
        android:layout_marginRight="4dip"/>

      <LinearLayout android:padding="10dip" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout3" android:orientation="vertical">
          <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:layout_width="match_parent">
              <TextView android:gravity="center" android:textColor="#525252" android:layout_height="fill_parent" android:singleLine="true" android:ellipsize="marquee" android:text="" android:textStyle="bold" android:id="@+id/pharmacy_row_toptext" android:layout_width="wrap_content" android:layout_marginRight="6dip"></TextView>
          </LinearLayout>
          <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout2" android:layout_width="match_parent">
                  <TextView android:layout_height="fill_parent" android:text="TextView" android:id="@+id/pharmacy_row_address" android:layout_width="wrap_content" android:layout_marginRight="6dip"></TextView>
          </LinearLayout>

          <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/linearLayout5">
              <TextView android:gravity="center" android:layout_height="fill_parent" android:text="TextView" android:singleLine="true" android:ellipsize="marquee" android:layout_width="wrap_content" android:id="@+id/pharmacy_row_telephone"></TextView>
          </LinearLayout>

          <LinearLayout android:layout_gravity="right" android:layout_height="wrap_content" android:id="@+id/linearLayout5" android:layout_width="match_parent">
              <TextView  android:layout_height="fill_parent" android:text="TextView" android:singleLine="true" android:ellipsize="marquee" android:layout_width="wrap_content" android:id="@+id/pharmacy_row_distance"></TextView>
          </LinearLayout>
      </LinearLayout>          

</LinearLayout>
而不是这个

public IconListViewAdapterPharmacy(Context cont, int textViewResourceId, ArrayList<PharmacyListItem> items, Location l)
{
    super(cont, textViewResourceId, items);
    this.cont = cont;
    this.items = items;
    this.l = l;
}

做这个

public IconListViewAdapterPharmacy(Context cont, int textViewResourceId, ArrayList<PharmacyListItem> items, Location l)
{
    super(cont, textViewResourceId, items);
    this.l = l;
}

然后在getView访问项中使用getItem(position)而不是items.get(position)并获取上下文调用getContext().

不知道这是否会改善性能.但尝试没有害处.这也是正确的方法.

编辑:
 如果您有要下载和显示的配置文件图像,可以像以后一样获取地址并更新UI.

String add = "" + o.getAddress();
if (TextUtils.IsEmpty(add)) {
    // download the geolocation. pass the position to the downloader thread which will update the item at position with address, after fetching is complete.
    new GetAddressTask(position).execute(o);
}

这将释放UI线程专注于显示listview.

class GetAddressTask extends Asynctask<.......> {
     int mPosition = -1;
     public void GetAddressTask(int position) {
         mPosition = position;
     }
     String doInBackground(parameters) {
         return GeoLocation.getaddress(parameter[0]);
     }

     void onPostExecute(String result) { // this runs on UI thread.
        // use mPosition here.
        // update addapter item with this address thats in 'result' variable.
       // and call adapter.notifyDatasetInvalidated()
     }
网友评论