I'm creating custom ListView. Adapter:
public class CustomListEventsAdapter extends BaseAdapter {
private Context context;
private List<Map<String, String>> values;
public CustomListEventsAdapter(Context context, List<Map<String, String>> values) {
this.context = context;
this.values = values;
}
@Override
public int getCount() {
return values.size();
}
@Override
public Object getItem(int position) {
return values.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final CustomItemForEventsList view = new CustomItemForEventsList(context, values.get(position), (long) position);
int itemHeight;
if (parent.getWidth() > parent.getHeight()) {
itemHeight = parent.getHeight();
} else {
itemHeight = parent.getHeight() / 2;
}
view.setLayoutParams(new ListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeight));
return view;
}}
Custom View for ListView's item:
public class CustomItemForEventsList extends View {
private MainActivity context;
private Map<String,String> values;
private long id;
private Paint pMainText;
private int viewWidth;
private int viewHeight;
private boolean isLandscape;
private Bitmap backgroundBitmap;
private RectF bitmapSizes;
private RectF viewSizes;
private Matrix matrix;
public CustomItemForEventsList(final Context context, Map<String,String> values, long id) {
super(context);
this.context = (MainActivity) context;
this.values = values;
this.id = id;
pMainText = new Paint(Paint.ANTI_ALIAS_FLAG);
pMainText.setColor(Color.WHITE);
pMainText.setTextAlign(Paint.Align.LEFT);
bitmapSizes = new RectF();
viewSizes = new RectF();
matrix = new Matrix();
loadBackgroundBitmap(values.get("url"));
}
private void loadBackgroundBitmap(final String url) {
context.imageLoader.loadImage(url, new ImageSize(viewWidth, viewHeight), context.displayImageOptions, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String s, View view) {
}
@Override
public void onLoadingFailed(String s, View view, FailReason failReason) {
// Log.d(Statics.LOG, "onLoadingFailed");
}
@Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
backgroundBitmap = bitmap;
invalidate();
}
@Override
public void onLoadingCancelled(String s, View view) {
// Log.d(Statics.LOG, "onLoadingCanceled");
loadBackgroundBitmap(url);
}
});
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
viewWidth = MeasureSpec.getSize(widthMeasureSpec);
viewHeight = MeasureSpec.getSize(heightMeasureSpec);
isLandscape = viewWidth > viewHeight;
viewSizes.set(0, 0, viewWidth, viewHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawARGB(255, 0, 0, 0);
// Drawing view's background
if (backgroundBitmap != null) {
if (!backgroundBitmap.isRecycled()) {
bitmapSizes.set(0, 0, backgroundBitmap.getWidth(), backgroundBitmap.getHeight());
matrix.setRectToRect(viewSizes, bitmapSizes, Matrix.ScaleToFit.FILL);
matrix.invert(matrix);
canvas.drawBitmap(backgroundBitmap, matrix, null);
}
}
}}
Everything works perfect on new Android's versions (tested on 4.0, 4.2, 4.4), but in 2.3.3 appears troubles with positioning and resizing of ListView items: bitmaps don't resize to view's sizes in onDraw, when we click on ListView or scroll it and release.
Screens from 2.3.3. That's what happening when we touch down ListView, then scroll, then wait for a while and release (that behavior I want to see in all cases): http://s16.postimg.org/qvf26fb45/image.png
And here is what usually happens, when we click on ListView or scroll and release: http://s22.postimg.org/d7fd8quc1/image.png
Why does it happen and how can we fix that?