android:更改方向时,如何在arrayadapter/listview中保存数据?

android:更改方向时,如何在arrayadapter/listview中保存数据?,android,listview,orientation,listadapter,Android,Listview,Orientation,Listadapter,如上所述,它是自动完成的吗?我的名单一经登记就空了?不,我需要改变方向=) 我的适配器 public class ResultsAdapter extends ArrayAdapter<SearchItem> implements Filterable{ private ArrayList<SearchItem> subItems; private ArrayList<SearchItem> allItems;// = new ArrayList<Se

如上所述,它是自动完成的吗?我的名单一经登记就空了?不,我需要改变方向=)

我的适配器

public class ResultsAdapter extends ArrayAdapter<SearchItem> implements Filterable{

private ArrayList<SearchItem> subItems;
private ArrayList<SearchItem> allItems;// = new ArrayList<SearchItem>();
private LayoutInflater inflater;
private PTypeFilter filter;
private OnCheckedChangeListener test;

public ResultsAdapter(Context context, int textViewResourceId, ArrayList<SearchItem> items,OnCheckedChangeListener a) {

    super(context, textViewResourceId, items);
        //this.subItems = items;
        for( int i = 0;i < items.size();i++){
            subItems.add(items.get(i));
        }
        this.allItems = this.subItems;
        inflater= LayoutInflater.from(context);

        test = a;
}
公共类ResultsAdapter扩展ArrayAdapter实现可过滤{
私有ArrayList子项;
私有ArrayList allItems;//=新ArrayList();
私人充气机;
专用PTypeFilter过滤器;
私有OnCheckedChangeListener测试;
公共结果适配器(上下文上下文、int textViewResourceId、ArrayList项、OnCheckedChangeListener a){
super(上下文、textViewResourceId、项);
//this.subItems=项目;
对于(int i=0;i
我的onCreate

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);        



    ListView lvr = (ListView)findViewById(R.id.search_results);



  //  if(savedInstanceState == null){
        this.m_adapter = new ResultsAdapter(home.this, R.layout.listrow, sResultsArr,home.this);
        this.specsAdapter = new FeaturesExpandableAdapter(home.this,new ArrayList<String>(),new ArrayList<ArrayList<Feature>>()); 
   // }
        lvr.setAdapter(this.m_adapter);
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView lvr=(ListView)findViewById(R.id.search\u results);
//如果(savedInstanceState==null){
this.m_adapter=新结果适配器(home.this,R.layout.listrow,sResultsArr,home.this);
this.specsAdapter=new FeaturesExpandableAdapter(home.this,new ArrayList(),new ArrayList());
// }
lvr.setAdapter(这个.m_适配器);

谢谢大家,当你改变方向时,数据不应该丢失。我能想象的唯一一件事是,你的活动布局不正确,比如,改变方向时,控件会移出可见区域。

如果你的内存中有数据需要在方向改变时保留,你需要做些什么最好的解决方案是实现
onSaveInstanceState()
,并使用它来存储数据,因为这不仅用于方向更改,还用于其他情况(例如,您的活动位于当前堆栈上,但需要从RAM中踢出,以便为堆栈中稍后的内容腾出空间).

您也可以使用

在您的活动中,类似这样的内容:

@Override
public Object onRetainNonConfigurationInstance() {
    return this.m_adapter.getItems();
}
然后在onCreate()中:

@覆盖
创建公共空间(捆绑冰柱){
超级冰柱;
//这里有更多的初始化内容
sResultsArr=(ArrayList)getLastNonConfigurationInstance();
if(sResultArr==null){
sResultsArray=new ArrayList();//或其他一些初始化
}
self.m_adapter=新结果适配器(home.this,R.layout.listrow,sResultsArr,home.this);
// ...
}

我认为你走错了方向。请花点时间看看Android开发者的视频:(大约1小时)


我跟随视频,当屏幕改变方向时,我的列表视图工作正常:-)

请将此代码放入您的
AndroidManifest.xml
文件中

activity
        android:name="MainActivity"
        android:label="@string/app_name" 
        android:configChanges="keyboardHidden|orientation|screenSize"

我使用
OnSaveInstanceState()
OnRestoreInstanceState()解决了这个问题

name_数组
保留在
ArrayAdapter ArrayAdapter=new ArrayAdapter(这个,R.layout.item,name_数组);


现在,当你从横向改为纵向和反向时,数据不是“perserve”?我首先读到的是“perverse”(对不起),但我猜你的意思是“preserve”)这似乎是很有可能的-或者,用于填充列表的数据可能会随着方向更改的活动而被销毁,但不会重新创建?嗨,thorsten,这是因为我实际使用了自定义arrayadapter来显示和存储适配器状态不正确的数据吗已保存?是否应在onCreate()中启动适配器?嗨,jack,我想是的,因为当我更改方向时,我的适配器出现了一个nullpointer异常。我的适配器没有重新创建的原因可能是什么?嗯。我正在使用API附带的Notes示例中的代码,用我的数据库中的项填充ListView。更改方向时,这不会被破坏。也许你正在创建将阵列适配器安装到“错误的位置”?即,被调用的代码,不仅通过创建活动,还通过更改方向?我无法想象,在重新调整屏幕方向时,活动应该被销毁和重新创建…嗨,托尔斯滕:默认情况下,方向更改将导致活动被销毁,请参阅:Joejy:也许您应该保存一些数据sting在活动的onSaveInstanceState()中,并在onRestoreInstanceState方法中解包?有关详细信息,请参阅活动文档。onSaveInstanceState我只能保存名称-值对。我可以知道如何保存实际对象本身吗?通过
onSaveInstanceState()
,您不能,因为您的进程可能会被破坏(参见我的答案中的示例)。您可以使用
onRetainonConfiguration实例()
在方向更改期间保留任意对象,但请记住,这几乎只处理方向更改,而不是从RAM中退出活动的场景。无论是
ArrayAdapter
还是其父类都没有
getItems
方法。我缺少什么?请注意,在最近的Android Relea中ses(至少4.0)这种做法非常不可取。那么新方法是什么?@Matthugins使用
getItemsArrayList()
。这个解决方案对我很有效。@Mgamerz为什么?你能再详细说明一点吗?这个解决方案既有效又简单。这是一个糟糕的黑客行为,最好学习如何存储配置更改的数据!
activity
        android:name="MainActivity"
        android:label="@string/app_name" 
        android:configChanges="keyboardHidden|orientation|screenSize"
@Override
    protected void onRestoreInstanceState(Bundle state){
        super.onRestoreInstanceState(state);
        name_array.addAll(state.getStringArrayList("key"));
        setListAdapter(arrayAdapter);
        arrayAdapter.notifyDataSetChanged();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        outState.putStringArrayList("key",name_array);
    }