这是正常的:
这很奇怪,当我滚动列表视图时,某些项目会缩小(但宽度和高度的值没有改变。):
在此屏幕截图中[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
以下是自定义视图:
<?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>
答案 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;
在:
后:
因此,如果没有添加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
而不是使用类型。