2

これがAndroidのバージョンや画面サイズの違いによる問題なのかどうかはわかりませんが、予期しない動作が発生しています。

MultiAutoCompleteTextViewオンになっているオンのドロップダウンのUIをテストしており、オンにNexus SなっているオンAndroid v4.1.2でテストしてNexus 4Android v4.2.1ます。

テキストを入力し始めると、MultiAutoCompleteTextViewいくつかの結果が返されます。ImageViewの左側にを含むカスタムビューを作成しましたTextView。行が最初に表示されるとき、はImageView特定の高さと幅を持ちます(左の画像)。

ただし、結果のリストをスクロールして元の行に戻ると、2つのことが起こります。ImageView同じ寸法のままであるか、の寸法ImageViewが変更されます(右の画像)。

この特定の動作と提供されているスクリーンショットは、で起こっていることですが、Nexus 4この問題をで再現することはできませんNexus S

開発者トレーニングで行われているのと同じように、大きなビットマップを効率的にロードBitmapsています。 ImageViews

連絡先行のレイアウトリソースは次のとおりです。

contact_entry2.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>

styles.xml

<?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>

また、RecipientsCursorAdapterは、SimpleCursorAdapter(BaseContactsAdapter extends SimpleCursorAdapter)の孫クラスです。

RecipientsCursorAdapter

package com.sendit.adapters;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckedTextView;
import android.widget.ImageView;

import com.sendit.Contact;
import com.sendit.R;
import com.sendit.util.ContactsUtils;
import com.sendit.util.ImageFetcher;

public class RecipientsCursorAdapter extends BaseContactsAdapter {

    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private Cursor mCursor;
    private ImageFetcher mImageFetcher;

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

    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);

            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));

        if (mContactCache.get(contactId) == null) {
            String name = mCursor.getString(mCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String number = ContactsUtils.getPhoneNumber(mContext, contactId);
            mContactCache.put(contactId, new Contact(name, number));
        }

        Contact c = mContactCache.get(contactId);

        CharSequence contactInfo = getContactInfoSpan(c.getName(), c.getPhoneNumber());

        holder.contactInfo.setText(contactInfo);

        mImageFetcher.loadImage(contactId, holder.contactPic);

        return convertView;
    }

}

誰かが私を何を調べるべきかに関して正しい方向に向けることができますか?これは画面解像度の問題ですか、それとも最新バージョンのAndroidは以前のバージョンとは異なる方法でこの状況を処理しますか?

4

2 に答える 2

2

ビューのリサイクルに関係していると思いますが、リストを下に移動してから戻ると、元の画像は、初期負荷で幅/高さが設​​定されたリサイクルビュー内に表示されます。異なるサイズの画像。

もしそうなら、それはおそらくAndroidのバージョンのバグです。いずれにせよ、あなたはそれに対処しなければならないでしょう。

ビューをリサイクルするときは、リロードされた画像に基づいて、またはすべて同じ高さで高さが一定になるように、画像ビューのサイズを明示的に設定/リセットする必要があります。

また、adjustViewBoundsやFit/Scale設定などのいくつかのImageViewパラメーターを試してみることもできます。

最近、Android 4.0.6と4.1.2(メモリからの数値...)の間でまったく異なる動作(EditTextViewでした)に遭遇しましたが、このがらくたはちょうど起こっているようです....非常に最近の非常に近いバージョンの間でさえAndroidの:-(

于 2013-01-03T10:12:25.890 に答える
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;
    }

}
于 2013-01-04T09:05:26.147 に答える