AutoCompleteTextView在不同版本的android中表现不同

时间:2012-12-27 03:10:17

标签: android android-imageview textview autocompletetextview

我不清楚这是Android的不同版本或不同屏幕尺寸的问题,但我得到一些不可预测的行为。

我正在测试MultiAutoCompleteTextViewNexus 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处理这种情况的方式与以前的版本不同?

2 个答案:

答案 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;
    }

}