保存ListView的状态以进行屏幕方向

时间:2012-07-29 20:26:20

标签: android listview bundle

我浏览了很多帖子,用于屏幕方向。 但我的情况有点不同。我的ListView具有自定义行布局。使用AsyncTask从Internet加载ImageView位图。我想要的是,是否可以保存我的ListView的ArrayAdapter或整个Li​​stView,以便在更改方向屏幕时保留其状态。

请建议一些帖子,或者如果发布了一些代码,它将非常有用。

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 个答案:

答案 0 :(得分:2)

您可以使用onRetainNonConfigurationInstance()方法保留ListView的状态。此方法在方向更改期间销毁活动之前执行,并且可以返回所需的任何对象,例如列表适配器。 Leter,在onCreate()方法中,可以通过调用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。我认为你不应该在AsyncTask中执行getView()因为它会在你滚动列表时被执行,所以你可以得到没有成像器的列表项(我认为)。

答案 1 :(得分:1)

为什么不将下载的数据存储在变量中,并且在更改方向时,使用存储的数据重新加载元素。 This link将帮助您捕捉屏幕方向更改事件。

答案 2 :(得分:-3)

我不是100%肯定你在问什么。但您可以设置方向,使其固定为某个值。我有一个问题,我有一个列表视图更改方向,所以我修改了方向,以便它只会以纵向模式生成输出。

我在活动代码中添加了此标记作为选项

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

我希望这是您正在寻找的答案。这将保持国家。如果这不能回答你的问题。我会尽力帮助你。