Android ListVIew未在RestoreSavInstanceState上更新

Android ListVIew未在RestoreSavInstanceState上更新,android,android-lifecycle,Android,Android Lifecycle,以下是我的方法: @Override public void onRestoreInstanceState(Bundle savedInstanceState) { DataBaseHandler handler = new DataBaseHandler(getApplicationContext()); //set the spinner for measurement type Spinner measurementTypeSpinner = (Spinner)

以下是我的方法:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {

    DataBaseHandler handler = new DataBaseHandler(getApplicationContext());

    //set the spinner for measurement type
    Spinner measurementTypeSpinner = (Spinner) findViewById(R.id.MeasurementTypes);
    ArrayAdapter adapter = (ArrayAdapter) measurementTypeSpinner.getAdapter();
    int typePos = adapter.getPosition(savedInstanceState.getString("measurementtype"));
    measurementTypeSpinner.setSelection(typePos);

    //set the spinner for the measurement unit
    Spinner measurementUnitSpinner = (Spinner) findViewById(R.id.MeasurementSubValues);
    ArrayAdapter arrayAdapter = (ArrayAdapter) measurementUnitSpinner.getAdapter();
    int unitPos = arrayAdapter.getPosition(savedInstanceState.getString("measurementunit"));
    measurementUnitSpinner.setSelection(unitPos);

    //set the value
    EditText value = (EditText) findViewById(R.id.unit_value);
    value.setText(savedInstanceState.getString("value"));

    /**
     * The list view stuff
     */
    ListView unitsList = (ListView) findViewById(R.id.units_list);
    unitsList.setItemsCanFocus(true);
    MeasurementType mType = handler.getMeasurementType(savedInstanceState.getString("measurementtype"));

    //create the converter
    Converter converter = new Converter(MeasurementType.getMeasurementType(savedInstanceState.getString("measurementtype")), savedInstanceState.getString("measurementunit"), savedInstanceState.getString("value"));
    //convert the values
    ArrayList<Unit> convertedValues = converter.convert();

    //set the adapter for the list view
    unitAdapter = new UnitListAdapter(this, convertedValues, mType);
    unitsList.setAdapter(unitAdapter);

}
@覆盖
RestoreInstanceState上的公共无效(Bundle savedInstanceState){
DataBaseHandler=新的DataBaseHandler(getApplicationContext());
//将微调器设置为“测量类型”
微调器measurementTypeSpinner=(微调器)findViewById(R.id.MeasurementTypes);
ArrayAdapter=(ArrayAdapter)measurementTypeSpinner.getAdapter();
int-typePos=adapter.getPosition(savedInstanceState.getString(“measurementtype”);
测量类型微调器。设置选择(类型POS);
//设置测量单位的微调器
微调器MeasurementsPinner=(微调器)findViewById(R.id.MeasurementsBValues);
ArrayAdapter ArrayAdapter=(ArrayAdapter)MeasurementAutonitsPinner.getAdapter();
int unitPos=arrayAdapter.getPosition(savedInstanceState.getString(“measurementunit”);
测量微调器设置选择(unitPos);
//设置值
EditText值=(EditText)findViewById(R.id.unit_值);
value.setText(savedInstanceState.getString(“值”));
/**
*列表视图内容
*/
ListView单元列表=(ListView)findViewById(R.id.units\u列表);
unitsList.setItemsCanFocus(true);
MeasurementType mType=handler.getMeasurementType(savedInstanceState.getString(“MeasurementType”);
//创建转换器
Converter Converter=新转换器(MeasurementType.getMeasurementType(savedInstanceState.getString(“MeasurementType”)、savedInstanceState.getString(“measurementunit”)、savedInstanceState.getString(“值”);
//转换值
ArrayList convertedValues=converter.convert();
//设置列表视图的适配器
unitAdapter=新的UnitListAdapter(此,convertedValues,mType);
unitsList.setAdapter(unitAdapter);
}
基本上,还有另一个活动包含一个项目列表,当用户选中一个项目时,它会更新数据库,将int属性设置为1,这样当ArrayAdapter遍历arraylist时,它会将该属性提取为1并显示,而不是0,在这种情况下,它不会显示该属性

现在按下后退按钮,两个微调器都填充了我存储的值,EditText的值被恢复,但是ListView没有更新,但是当我离开应用程序并返回时,选中的值在列表中

这对我说,我可能需要对onStop()和onRestart()进行一些操作,请有人给我一些建议。“列表视图的东西”是我试图更新列表视图的地方,它只是不起作用,当我调试它时,它根本不会进入还原方法,这是令人困惑的

编辑

public class UnitListAdapter extends ArrayAdapter<Unit> {
    private Context context;
    private ArrayList<Unit> units;
    private MeasurementType type;

    public UnitListAdapter(Context context, ArrayList<Unit> units, MeasurementType type) {
        super(context, R.layout.unit, R.id.unit_name, units);
        this.context = context;
        this.units = units;
        this.type = type;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.unit, parent, false);
        final TextView unitName = (TextView) rowView.findViewById(R.id.unit_name);
        final EditText unitValue = (EditText) rowView.findViewById(R.id.unit_value);
        if(units.get(position) != null) {
            if(units.get(position).getView() == 1) {
                unitName.setText(units.get(position).getUnitName());
                unitValue.setText(units.get(position).getValue().toString());
            } else {
                unitName.setVisibility(View.GONE);
                unitValue.setVisibility(View.GONE);
            }
        }

        return rowView;
    }

    @Override
    public void add(Unit u) {
        units.add(u);
        notifyDataSetChanged();
    }

    @Override
    public void clear() {
        units.clear();
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return units.size();
    }

}
公共类UnitListAdapter扩展了ArrayAdapter{
私人语境;
私营ArrayList单位;
私有度量类型;
公共UnitListAdapter(上下文上下文、ArrayList单位、MeasurementType类型){
super(上下文、R.layout.unit、R.id.unit\u名称、单位);
this.context=上下文;
这个。单位=单位;
this.type=type;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
视图行视图=充气机充气(R.layout.unit,父项,false);
final TextView unitName=(TextView)rowView.findViewById(R.id.unit\u name);
最终的EditText unitValue=(EditText)rowView.findViewById(R.id.unit_值);
if(单位获取(位置)!=null){
if(units.get(position).getView()==1){
unitName.setText(units.get(position.getUnitName());
unitValue.setText(units.get(position.getValue().toString());
}否则{
unitName.setVisibility(View.GONE);
unitValue.setVisibility(View.GONE);
}
}
返回行视图;
}
@凌驾
公共空间添加(单位u){
增加(u);
notifyDataSetChanged();
}
@凌驾
公共空间清除(){
单位。清除();
notifyDataSetChanged();
}
@凌驾
public int getCount(){
返回单位.size();
}
}

正如所要求的那样。很抱歉编辑时出现混淆。

更新列表后,需要调用notifyDataSetChanged()重新填充列表视图


当用户按下后退按钮时,不会调用onRestoreInstanceState()。您很可能需要将逻辑移动到
onResume()
。我建议您阅读有关活动生命周期的内容,以便更好地了解调用每个
onXxx()
方法的时间。

我实际上从代码中删除了该方法,因为它不起作用,我将其重新添加,但与上次一样,它不起作用。我还添加了一些日志语句以确保,但没有记录任何日志语句…当我尝试调试时,比如在我的arrayadapter中,它没有被调用是有原因的吗?它应该被调用,您可以发布unitlistadapter的代码吗?我已经添加了适配器implementation@user2405469哪些日志语句不会被记录?他们在哪?另外,关于断点的问题也是一样……到底什么没有被调用?我尝试过这样做:ArrayAdapter currentAdapter=(ArrayAdapter)unitsList.getAdapter();currentAdapter.clear();对于(单位u:convertedValues){currentAdapter.add(u);currentAdapter.notifyDataSetChanged();}currentAdapter.notifyDataSetChanged();我认为最好是获取当前的底层适配器,清除其值,然后从arrayList中添加新值,然后尝试更新列表视图……但它也不起作用。我也尝试过使用invalidate()方法,但它不起作用。我刚刚用onPause和onResume实现了它,它起作用了…这就是我要问的…只是不太好