Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – ListView使我的应用程序运行速度很慢,虽然我创建了Holder Class大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我对这个问题变得非常绝望,而且我一直在尝试你在其他线程中发布的所有想法.

问题是我的程序大量调用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://scheR_362_11845@as.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,LOCATIOn l)
{
    super(cont,items);
    this.cont = cont;
    this.items = items;
    this.l = l;
}

做这个

public IconListViewAdapterPharmacy(Context cont,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()
     }

大佬总结

以上是大佬教程为你收集整理的android – ListView使我的应用程序运行速度很慢,虽然我创建了Holder Class全部内容,希望文章能够帮你解决android – ListView使我的应用程序运行速度很慢,虽然我创建了Holder Class所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。