0

我创建了一个列表,其中每行有几个信息,还有一个图像。我的问题是,当我查看下面的列表项时,必须加载图像并且它会堆叠直到它们被加载。我正在使用 BaseAdapter 来制作列表。有没有其他方法可以在不堆叠的情况下制作列表?例如,如果我尝试使用 ArrayAdapter 或 CursorAdapter 加载速度会更快吗?或者也许我必须更改其他内容才能使其正常工作?我会放代码......希望它会有所帮助!

列表片段

   public class SearchCarListActivity extends ListFragment {

private Button profileBtn;
private Button toggleMapListBtn;
private Button filterBtn;
private SearchCarListAdapter adapter;
private Location loc;
private SearchActivity parent;
private ArrayList<Car> cars;
private Location location;
private SearchFragmentActivity sfa;
private ArrayList<String> distance;


public void setCars(ArrayList<Car> cars){
    this.cars = cars;
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    SearchFragmentActivity afa = (SearchFragmentActivity)getActivity();
    afa.setCar((Car)adapter.getItem(position));
    Car c = (Car)adapter.getItem(position);
    afa.changeFragment(new SearchCarListExpandable());

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);



}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    return inflater.inflate(R.layout.list_search_cars, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    setUpViews();
    parent = (SearchActivity)getActivity().getParent();


    LocationManager lm = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_COARSE);  // Faster, no GPS fix.
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    loc = lm.getLastKnownLocation(lm.getBestProvider(criteria, true));
    sfa = (SearchFragmentActivity) getActivity();
    cars = sfa.getCars();
    removeDeleted();
    setUpDistances();
    adapter = new SearchCarListAdapter(this.getActivity(), cars, distance);
    adapter.setCurrentLocation(loc);
    setListAdapter(adapter);
}

private void removeDeleted(){
    ArrayList<Car> c = new ArrayList<Car>();
    for (Car car:cars){
        if (car.getPricePerHour()!=0 || car.getPricePerKm()!=0){
            c.add(car);
        }
    }
    cars = c;
}

private void setUpDistances() {
    // TODO Auto-generated method stub
    distance = new ArrayList<String>();
    Location l = sfa.getMyLocation();
    String distan;
    for (Car car:cars){
        GeoPoint gp=car.getLocation();

        if (car.getLatitude()==0.0){
            distan = "Unknown";
        }else{
            float[] f = new float[3];
            Location.distanceBetween(l.getLatitude(), l.getLongitude(), (gp.getLatitudeE6()/1E6), (gp.getLongitudeE6()/1E6), f);
            Double dist = Double.valueOf(f[0]/1000);
            Short s = dist.shortValue();

            distan = (s.toString()+"Km");
        }
        distance.add(distan);
    }
}

private void setUpViews() {
    toggleMapListBtn = (Button)getView().findViewById(R.id.toggleMapListBtnInListView);
    toggleMapListBtn.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            SearchCarListActivity.this.getActivity().finish();

        }
    });

    filterBtn = (Button)getView().findViewById(R.id.filterListSearchBtn);
    filterBtn.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            Intent i = new Intent(getActivity().getParent(), FilterSearchActivity.class);
            TabGroupActivity parentActivity = (TabGroupActivity)getActivity().getParent();
            parentActivity.startChildActivity("FilterSearchActivity", i);
        }
    });


}

@Override
public void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    adapter = new SearchCarListAdapter(this.getActivity(), cars, distance);
    adapter.setCurrentLocation(loc);
    setListAdapter(adapter);

}
  }

基础适配器:

   public class SearchCarListAdapter extends BaseAdapter {

private ArrayList<Car> cars;
private Context context;
private Location currentLocation;
private ArrayList<String> distances;

public SearchCarListAdapter(Context c, ArrayList<Car> cars, ArrayList<String> distances){
    super();
    this.context = c;
    this.cars = cars;
    this.distances = distances;

}

public int getCount() {
    return cars.size();
}

public Object getItem(int position) {
    return (null == cars) ? null : cars.get(position);
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    SearchCarItemView clv;
    if(null == convertView){
        clv = (SearchCarItemView)View.inflate(context, R.layout.search_car_list_item, null);
    } else {
        clv = (SearchCarItemView)convertView;
    }
    clv.setLocation(this.currentLocation);
    clv.setDistance(distances.get(position));
        clv.setCar(cars.get(position));

    return clv;
}

public Location getCurrentLocation() {
    return currentLocation;
}

public void setCurrentLocation(Location currentLocation) {
    this.currentLocation = currentLocation;
}

public String getNumberplate(int position) {
    Car c = cars.get(position);
    return c.getLicensePlate();

}

 }

项目视图:

  public class SearchCarItemView extends LinearLayout {

private TextView name;
private ImageView iv;
private TextView distance;
private Car car;
private Context context;
private Location currentLocation;
private String distan;
private TextView addr;
private List<Address> address = new ArrayList<Address>();
private TextView priceKm;
private TextView priceH;
private TextView reviews;
private int reviCount;

public SearchCarItemView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
    // TODO Auto-generated constructor stub
}

@Override
protected void onFinishInflate(){
    super.onFinishInflate();
    name = (TextView)findViewById(com.tapazz.R.id.txtCarListItemName);  
    addr = (TextView)findViewById(R.id.txtCarListItemAddress);
    iv = (ImageView)findViewById(com.tapazz.R.id.carListItemSmallImage);
    distance = (TextView)findViewById(com.tapazz.R.id.txtCarListItemDistance);
    priceKm = (TextView)findViewById(R.id.txtCarListItemPricePerKm);
    priceH = (TextView)findViewById(R.id.txtCarListItemPricePerHour);
    reviews = (TextView)findViewById(R.id.txtCarListItemReviews);
}



public Car getCar() {
    return car;
}

public void setCar(final Car car){
    iv.setImageBitmap(null);
    this.car = car;
    name.setText(car.getName());
    getAddress();
    if(address.size()>0){
        String displayAddress = "";
        for(int i =0; i<address.get(0).getMaxAddressLineIndex(); i++){

            displayAddress += address.get(0).getAddressLine(i);
        }
        addr.setText(displayAddress);
    }
    Log.d("equals?", ((Boolean)car.getPhotoUrl().equals("")).toString());
    if(car.getPhotoUrl()!=null && !car.getPhotoUrl().equals("")){
        String thumbUrl = "http://tapazz.com/autopia/upload/thumbnail.php?image=cars/"+car.getPhotoUrl()+"&maxWidth=150&maxHeight=150";
        String urlString = "http://tapazz.com/autopia/upload/thumbnail.php?image=cars/"+car.getPhotoUrl()+"&maxWidth=150&maxHeight=150";
        DrawableManager.fetchDrawableOnThread(urlString, iv, null);
    }else{
        iv.setImageResource(R.drawable.take_photo_normal);
    }
    distance.setText(getDistance(car));
    priceKm.setText(String.format("€%.2f/km",car.getPricePerKm()));
    priceH.setText(String.format("€%.2f/H",car.getPricePerHour()));
    Thread thread = new Thread(){
        public void run(){

            Connection conn = Connect.getConnection();
                try {
                    Statement stmt = conn.createStatement();
                    String sql = "SELECT COUNT(Remarks) FROM BOOKING WHERE Car= "+car.getId()+" AND Remarks IS NOT NULL AND Remarks <> ''";
                    Log.d("SQL Review:", sql);
                    ResultSet rs = stmt.executeQuery(sql);
                    if (rs.next()){
                        reviCount = rs.getInt("COUNT(Remarks)");
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            finally{
            }   
        }
    };
    thread.start();
    try {
        thread.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    reviews.setText("Reviews: "+reviCount);
}

public void getAddress(){
    Geocoder geocoder = new Geocoder(context, Locale.getDefault());
    try {
        address = geocoder.getFromLocation(car.getLatitude(), car.getLongitude(), 1);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void setDistance (String distan){
    this.distan = distan;
}

private String getDistance(Car car) {
    String dis = "Distance: "+distan;

    //get distance
    return dis;
}

public void setLocation(Location currentLocation) {
    this.currentLocation =currentLocation;

}

 }
4

3 回答 3

0

您需要异步加载图像,请考虑在 ThreadPool 的上下文中使用 AsyncTask;你不应该在你的 UI 线程中处理加载图像,还要记住如果你没有正确处理大图片,最终可能会发生 OOM 异常。

看看这里,它将指导您完成您应该做什么: http ://android-developers.blogspot.dk/2010/07/multithreading-for-performance.html

在他的 AsyncTask 类中,他正在处理下载图片,您应该将那段代码替换为从 sdcard 加载图片

于 2012-12-18T10:42:54.877 回答
0

您应该使用 LazyList 概念此链接将对您的 惰性列表有所帮助

另一个链接是链接

于 2012-12-18T15:35:40.907 回答
0

我发现了问题!问题是我是 sql 问题并从视图中的 url 下载图像,每次我在列表中向下时它都必须加载,所以它会堆叠直到加载。现在我首先加载片段中的所有信息并将其传递给适配器,现在速度更快(它已经不完美但运行良好)。我尝试更改为 ArrayAdapter,但我的情况没有任何区别。我必须尝试使用​​ cursoradapter 看看是否可以做得更好。感谢大家的帮助!!

于 2012-12-18T15:23:55.203 回答