2012-07-29 49 views
3

我經歷了很多帖子的屏幕方向。 但我的情況有點不同。我的ListView有自定義的行佈局。使用AsyncTask從Internet上加載ImageView位圖。我想要的是,是否可以保存我的ListView或整個Li​​stView的ArrayAdapter,以便在方向屏幕更改時保存其狀態。保存我的ListView的狀態爲屏幕方向

請推薦一些帖子或者如果發佈了一些代碼,這將是非常有用的。

public View getView(int position, View convertView, ViewGroup parent) { 
     final Contents entry = contentList.get(position); 
     View row = convertView; 
     LayoutInflater infltr = null; 
      if (row == null) { 
       infltr = (LayoutInflater) context 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row = inflater.inflate(R.layout.highlight_contents_layout, 
         parent, false); 
     } 

      ImageView imgViewImage = (ImageView) row 
        .findViewById(R.id.imgView_Image); 
      if (imgViewImage.getTag() == null) { 
       new DownloadImage(imgViewImage, entry).execute(); //Async Task to download Image 
      } 

     } 
     return row; 
    } 

和的onCreate我有一個函數調用來填充列表的函數調用:

init(){ 
listContent = (ListView) findViewById(R.id.listview); //vairable declared at top of my class; 
contentlist = new ArrayList<Contents>(); //Variable Declared at top of class; 

//... Populated the contenlist... in here 
//.. 
//.. 
adapter = new ListAdapter(getApplicationContext(), 
       R.layout._contents_layout, contentList, 
       thumb_image_bytes); 
     listContent.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
} 

回答

-3

我不是100%肯定你所要求的。但是您可以設置方向,使其固定爲某個值。我遇到了一個問題,那就是在定位時列表視圖發生了變化,因此我固定了方向,以便它只能以縱向模式生成輸出。

我加入這個標籤我的活動標籤中作爲一個選項

<activity android:name="preferences.Preferences" android:screenOrientation="portrait"></activity>. 

我希望這是你正在尋找的答案。這將保持狀態。如果這不能回答你的問題。我會盡力幫助你。

+0

這不是由google推薦 – 2014-07-10 15:02:16

1

爲什麼不把變量下載的數據保存下來,在改變方向後,用存儲的數據重新加載元素。 This link將幫助您捕捉屏幕方向更改事件。

+0

我在想方設法。爲什麼不將我的圖像的字節[]保存在永久存儲器中。所以當我旋轉我的屏幕時,我將從我的永久存儲器加載。如果你有其他想法,請分享。 – Debopam 2012-08-01 04:20:25

2

您可以使用onRetainNonConfigurationInstance()方法來保留您的ListView的狀態。在方向更改期間活動被破壞之前執行此方法,並且它可以返回所需的任何對象,例如您的列表適配器。通過調用getLastNonConfigurationInstance(可以恢復對象的方法);

因此,在您的活動中創建字段,例如mAdapter。該字段將持有對您的列表適配器的引用。覆蓋onRetainNonConfigurationInstance()這樣的:

@Override 
public Object onRetainNonConfigurationInstance() { 
    return mAdapter; 
} 

而且在onCreate()方法恢復列表適配器:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mList = (ListView) findViewById(android.R.id.list); 

    Object obj = getLastNonConfigurationInstance(); 

    if(null != obj){//if there is saved adapter - restore it 
     mAdapter = (ArrayAdapter<String>)obj; 
    } else { //if not - create new one 
     mAdapter = new ArrayAdapter<String>(getApplicationContext(), 
       android.R.layout.simple_list_item_1, listData); 
    } 
     mList.setAdapter(mAdapter); 
} 

編輯:

這並不好看我:

ImageView imgViewImage = (ImageView) row 
        .findViewById(R.id.imgView_Image); 
     if (imgViewImage.getTag() == null) { 
      new DownloadImage(imgViewImage, entry).execute(); //Async Task to download Image 
} 

請檢查imgViewImage.getTag()曾經返回false。我認爲你不應該在getView()執行AsyncTask,因爲它會在你滾動列表的時候執行,所以你可以得到沒有imager的列表項(我認爲)。

+0

無法正常工作...我的行中有一些圖片是從互聯網上下載的。當我改變方向時,它會再次下載。我該如何處理?但從我的列表中textView下載的文本仍然在它的位置。我該如何處理? – Debopam 2012-07-30 07:22:28

+0

我已實現了以下的代碼: 如果(customClass.getImageSourceBytes()== NULL){ \t \t \t \t \t新DownloadImageTask(imgView,customClass).execute(); }否則如果(customClass.getImageSourceBytes()長度> 0){\t \t \t \t imgView.setImageBitmap(convertBitmap(customClass.getImageSourceBytes()));} 它的工作原理,對取向變化else部分被觸發,而不需要再次下載圖像。但ImageView不顯示圖像。我不知道爲什麼?我是否需要重新初始化? – Debopam 2012-07-30 07:28:32

+0

你可以通過代碼的onCreate()和你的列表適配器(特別是getView()方法) – Leszek 2012-07-30 13:52:13