我创建了一个列表,每行包含多个信息,还有一个图像。我的问题是,当我去查看下面的列表项时,必须加载图像并堆叠直到它们被加载。我正在使用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);
}
}
BaseAdapter:
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();
}
}
ItemView控件:
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;
}
}
答案 0 :(得分:0)
您需要异步加载图像,考虑在ThreadPool的上下文中使用AsyncTask;你不应该处理你的UI线程中的图像加载,也要记住,如果你没有处理正确的大图片,可能会发生最终的OOM异常。
看看这里,它会指导你完成你应该做的事情: http://android-developers.blogspot.dk/2010/07/multithreading-for-performance.html
在他的AsyncTask课程中,他正在处理下载图片,你应该用加载sdcard中的图片替换那段代码
答案 1 :(得分:0)
我发现了问题! 问题是我是sql问题并从视图中的url下载图像,每次我在列表中下载它必须加载所以它堆叠直到它加载。现在我首先加载片段中的所有信息并将其传递给适配器,现在速度要快得多(它已经不完美了但是进展顺利)。 我尝试更改为ArrayAdapter,我没有看到我的情况有任何区别。我必须尝试用cursoradapter来看看它是否可以做得更好。 感谢所有人的帮助!!
答案 2 :(得分:0)