我不清楚这是Android的不同版本或不同屏幕尺寸的问题,但我得到一些不可预测的行为。
我正在测试MultiAutoCompleteTextView
上Nexus S
的下拉列表的用户界面Android v4.1.2
,我正在{{1}上的Nexus 4
进行测试}}
当我开始在Android v4.2.1
中输入文字时,它会返回一些结果。我创建了一个自定义视图,其中包含MultiAutoCompleteTextView
左侧的ImageView
。首次显示a行时,TextView
将具有一定的高度和宽度(左图)。
但是,一旦滚动结果列表并返回到原始行第一行,就会发生两件事情。 ImageView
保持相同的尺寸,或者ImageView
的尺寸会发生变化(右图)。
此特定行为以及提供的屏幕截图是ImageView
上发生的情况,但我无法在Nexus 4
上重现此问题。
我正在Nexus S
加载Bitmaps
,就像在开发人员培训Loading Large Bitmaps Efficiently中完成一样。
以下是联系人行的布局资源:
contact_entry2.xml
ImageViews
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/contactPic"
android:layout_width="wrap_content"
vandroid:layout_height="fill_parent"
android:contentDescription="@string/contact_pic_desc"
android:focusable="false"
android:focusableInTouchMode="false"
android:src="@drawable/ic_contact_picture" />
<CheckedTextView
android:id="@+id/contactInfo"
style="@style/CheckedTextViewStyle" >
</CheckedTextView>
</LinearLayout>
RecipientsCursorAdapter是<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="CheckedTextViewStyle">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="android:textColor">@color/black</item>
<item name="android:background">@color/white</item>
<item name="android:gravity">center_vertical</item>
<item name="android:paddingLeft">10dp</item>
</style>
</resources>
的孙子类(BaseContactsAdapter extends SimpleCursorAdapter
):
RecipientsCursorAdapter
SimpleCursorAdapter
任何人都能指出我正确的方向吗?这是一个屏幕分辨率问题,还是最新版本的Android处理这种情况的方式与以前的版本不同?
答案 0 :(得分:2)
我会疯狂地猜测它与View回收....当你下到列表然后备份,你的原始图像显示在一个回收的视图中,它的宽度/高度设置在初始加载不同大小的图像。
如果是这样,它可能是Android版本中的一个错误。无论哪种方式,你都必须处理它。
当您回收视图时,您应该再次显式设置/重置图像视图大小,或者根据重新加载到其中的图像,或者如果您需要它们,所有相同的高度都有一个高度常量。
您可能还希望使用一些ImageView参数,例如adjustViewBounds或Fit / Scale设置。
最近,我在Android 4.0.6和4.1.2(来自内存的数字......)之间遇到了一些完全不同的行为(是EditTextView),而这个废话似乎恰好发生......甚至最近也是如此。相当接近的Android版本: - (
答案 1 :(得分:1)
感谢@Andrew的建议。以下是我修复图像大小调整问题的方法。在实例化ImageView
引用时,我调用了setScaleType()
setLayoutParams()
和ViewHolder
方法。
public class RecipientsCursorAdapter extends BaseContactsAdapter {
private final String DEBUG_TAG = getClass().getSimpleName().toString();
private Cursor mCursor;
private ImageFetcher mImageFetcher;
private final Drawable mDefaultContactPic;
private LinearLayout.LayoutParams mImageViewLayoutParams;
public RecipientsCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to, Activity a, int flags, ImageFetcher imageFetcher) {
super(context, layout, c, from, to, a, flags);
mImageFetcher = imageFetcher;
mDefaultContactPic = context.getResources().getDrawable(R.drawable.ic_contact_picture);
mImageViewLayoutParams = new LinearLayout.LayoutParams(mDefaultContactPic.getIntrinsicWidth(), mDefaultContactPic.getIntrinsicHeight());
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.contact_entry2, null);
// Creates a ViewHolder and store references to the children views
// we want to bind data to.
holder = new ViewHolder();
holder.contactInfo = (CheckedTextView) convertView.findViewById(R.id.contactInfo);
holder.contactPic = (ImageView) convertView.findViewById(R.id.contactPic);
holder.contactPic.setScaleType(ImageView.ScaleType.CENTER_CROP);
holder.contactPic.setLayoutParams(mImageViewLayoutParams);
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
holder.position = position;
mCursor = getCursor();
mCursor.moveToPosition(position);
int contactId = mCursor.getInt(mCursor.getColumnIndex(ContactsContract.Contacts._ID));
/*...*/
mImageFetcher.loadImage(contactId, holder.contactPic);
return convertView;
}
}