2012-07-29 54 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