3

我浏览了许多有关屏幕方向的帖子。但我的情况有点不同。我的 ListView 有自定义行布局。使用 AsyncTask 从 Internet 加载 ImageView 位图。我想要的是,是否可以保存我的 ListView 的 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();
}
4

3 回答 3

2

您可以ListView使用onRetainNonConfigurationInstance()方法保留您的状态。此方法在方向更改期间销毁活动之前执行,它可以返回您想要的任何对象,例如您的列表适配器。莱特,在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()曾经返回错误。我认为您不应该执行AsyncTaskgetView()因为它将在您滚动列表时执行,因此您可以获得没有成像器的列表项(我认为)。

于 2012-07-29T21:26:05.067 回答
1

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

于 2012-07-29T20:44:42.857 回答
-3

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

我在我的活动标签中添加了这个标签作为一个选项

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

我希望这是您正在寻找的答案。这将保留状态。如果这不能回答您的问题。我会努力进一步帮助你。

于 2012-07-29T20:33:37.277 回答