2012-03-13 218 views
0

這是正常的:(但寬度和高度的值沒有改變)奇怪的行爲,項目在滾動時ListView自動縮放?

This is the normal

這是奇怪的,當我滾動列表視圖的一些項目收縮:

some items zoom-out

在這個截圖項目[1:3]是同一種,但項目[3]沒有規模。哪個項目縮放似乎隨機可能基於設備或內容。

ListView和適配器的代碼是沒有什麼特別的:

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

    } 

層次瀏覽器(右下角)的截圖: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> 
+0

你可以發佈ListView的自定義行的XML代碼? – Meatje 2012-03-13 09:00:07

+0

好的,我已更新該帖子。 – DouO 2012-03-13 09:08:02

+0

你真的有10000種不同的風景嗎? – Blackbelt 2012-03-17 10:45:19

回答

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,查看。 buildDrawingCache(boolean autoScale)將返回錯誤的緩存位圖,這就是奇怪的縮放發生的原因。

btw:返回10000或getViewTypeCount中的任何其他值沒有意義。因爲我發現系統從來不會調用它。

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而不是使用類型。

+0

我相信getViewTypeCount()指的是你的listview將容納多少個不同的視圖。例如),在聊天應用程序中,您可能需要使用不同的聊天泡泡,其中一個用於發送消息,另一個用於發送給您的消息。在這種情況下,我相信getViewTypeCount應該返回2. getItemViewType()將通過告訴listview在某個位置使用哪個viewType來幫助回收視圖。例如)返回1發送給您的消息,返回2您發送的消息。 – 2012-11-15 18:12:09

+0

這是正確的@Zachary,但對於OP示例,他不需要類型的視圖,但他宣稱10000視圖類型,顯然不適合它的使用。 – marmor 2012-11-17 12:25:45

+0

你是正確的,它不需要這些功能被超載。我混淆了實現ListAdapter接口,您必須具有這些功能與SubAdding的BaseAdapter它是可選的覆蓋。作爲除去函數的替代方法,可以將getViewTypeCount()的返回值設置爲1,將getItemViewType()設置爲0,這將解決問題,同時保持相同的結構並允許混合不同的視圖。 – 2012-11-20 00:28:25