奇怪的行为,滚动时ListView中的Item自动缩放?

时间:2012-03-13 08:33:43

标签: android user-interface

这是正常的:

This is the normal

这很奇怪,当我滚动列表视图时,某些项目会缩小(但宽度和高度的值没有改变。):

some items zoom-out

在此屏幕截图中[1:3]项目是同一种类,但项目[3]没有缩放。哪个项目缩放似乎随机化可能基于设备或内容。

ListView和Adapter的代码没什么特别的:

mListView = new ListView(mContext);
mListView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
mProviderAdapter = new ProviderAdapter();
mListView.setAdapter(mProviderAdapter);


class ProviderAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return mCount;
        }

        @Override
        public Object getItem(int position) {
            return mProviders.get(position);
        }

        @Override
        public long getItemId(int position) {
            return mProviders.get(position).mMsgSpace;
        }

        @Override
        public int getViewTypeCount() {
            return 10000;
        }
        @Override
        public int getItemViewType(int position) {
            // TODO Auto-generated method stub
            return (position);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return mProviders.get(position).getUI().getView();
        }

    }

Hierarchy Viewer(右下角)的屏幕截图:Link enter image description here

以下是自定义视图:

<?xml version="1.0" encoding="UTF-8"?>
<ViewAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#44FFFFFF" >


        <LinearLayout
            android:id="@+id/word"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:id="@+id/content"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="#EC5800"
                    android:textSize="24sp" />

                <TextView
                    android:id="@+id/pron"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:gravity="bottom" />
            </LinearLayout>

            <TextView
                android:id="@+id/definition"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="20sp" />

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <Button
                    android:id="@+id/add"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="16dp"
                    android:text="@string/add"
                    android:textSize="20sp" />

                <Button
                    android:id="@+id/sound"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="16dp"
                    android:contentDescription="@string/audio"
                    android:padding="16dp"
                    android:text="@string/audio"
                    android:textSize="20sp" />

                <Button
                    android:id="@+id/switch_button"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="16dp"
                    android:contentDescription="@string/audio"
                    android:padding="16dp"
                    android:text="@string/definition"
                    android:textSize="20sp" />

            </LinearLayout>
        </LinearLayout>

    <LinearLayout
        android:id="@+id/login"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <Button
            android:id="@+id/login_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="Login" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/blank"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </LinearLayout>

</ViewAnimator>

另一种观点:

<?xml version="1.0" encoding="utf-8"?>
<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ViewSwitcher1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/example_panel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/example_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Medium Text"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/example_zh_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TextView" />

        <TextView
            android:id="@+id/example_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Medium Text"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/example_zh_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TextView" />

        <Button
            android:id="@+id/switchto_note"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/note_panel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/note_input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textMultiLine" >

            <requestFocus />
        </EditText>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <Button
                android:id="@+id/comfirm"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button" />

            <Button
                android:id="@+id/cancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button" />
        </LinearLayout>
    </LinearLayout>

</ViewSwitcher>

2 个答案:

答案 0 :(得分:1)

@mice的评论将解决问题。

@Override
public int getItemViewType(int position) {
    return IGNORE_ITEM_VIEW_TYPE
}

因为这个问题是由listview的循环机制造成的(稍微复杂一些,我还在学习,无法解释更多:()

视图的缓存机制更准确。

但它无法解释奇怪的缩放。

经过多次测试,我终于发现奇怪的缩放是一个兼容性问题。 将<uses-sdk android:minSdkVersion="4"/>添加到AndroidManifest.xml将修复它。

为什么?

Display display = getWindowManager()
        .getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
View v  = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
String s = "DisplayMetrics:"
        + getResources().getDisplayMetrics()
        + "\nview : "
            + v.getWidth()+"*"+v.getHeight()
            + "\nscreen:" + width + "*" + height;

在:

before

后:

after

因此,如果没有添加android:minSdkVersion,View。buildDrawingCache(boolean autoScale)将返回错误的缓存位图,这就是奇怪的缩放发生的原因。

btw:返回10000或getViewTypeCount中的任何其他值没有意义。因为我发现系统从不称呼它。

答案 1 :(得分:0)

您似乎在滥用getViewTypeCount

从适配器中删除以下方法

@Override
public int getViewTypeCount() {
    return 10000;
}
@Override
public int getItemViewType(int position) {
    // TODO Auto-generated method stub
    return (position);
}

如果您希望列表中的第一项看起来不同,请使用addHeaderView(View v, Object data, boolean isSelectable)上的ListView而不是使用类型。

相关问题