我浏览了很多帖子,用于屏幕方向。 但我的情况有点不同。我的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();
}
答案 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>.
我希望这是您正在寻找的答案。这将保持国家。如果这不能回答你的问题。我会尽力帮助你。