2014-08-08 6 views
0

Вот мой метод:ListView не обновляя onRestoreSaveInstanceState

@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); 

} 

В принципе, есть другая деятельность с перечнем предметов и когда пользователь проверяет один, он обновляет устанавливая ИНТ свойство 1, так что база данных когда ArrayAdapter проходит через arraylist, он выбирает свойство как 1 и отображает его вместо 0, и в этом случае он не отображает его.

Теперь при нажатии кнопки «Назад» оба витка заполняются сохраненными значениями, значение для EditText восстанавливается, но ListView не обновляется, но когда я покидаю приложение и вернусь, значение который был проверен, есть в списке ...

Это говорит мне, что мне может понадобиться что-то сделать с помощью onStop() и onRestart(), если кто-то угодит мне советом. Комментарий, говорящий «материал списка списка», я пытаюсь обновить представление списка, он просто не работает, и когда я его отлаживаю, он вообще не войдет в метод восстановления, что путает.

EDIT

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(); 
    } 

} 

Как просили. Извините за путаницу во время редактирования.

+0

Я пробовал сделать это: ArrayAdapter currentAdapter = (ArrayAdapter ) unitsList.getAdapter(); currentAdapter.clear(); для (Unit u: convertValues) { currentAdapter.add (u); currentAdapter.notifyDataSetChanged(); } currentAdapter.notifyDataSetChanged(); Я подумал, что было бы лучше получить текущий базовый адаптер, очистить его значения и просто добавить новые значения из списка arrayList, а затем попытаться обновить представление списка как таковое ... но это тоже не сработало. – user2405469

+0

Я также попытался использовать метод invalidate(), но это не сработало. – user2405469

ответ

1

onRestoreInstanceState() не вызывается, когда пользователь нажимает на кнопку назад. Скорее всего, вам нужно переместить свою логику до onResume(). Я предлагаю вам прочитать о жизненном цикле активности, чтобы лучше понять, когда вызывается каждый из методов onXxx().

+0

Я только что реализовал его, используя onPause и onResume, и он работает ... вот что я просил ... просто не очень хорошо – user2405469

1

После обновления списка вам необходимо вызвать notifyDataSetChanged(), чтобы повторно заполнить список.

http://developer.android.com/reference/android/widget/ArrayAdapter.html#notifyDataSetChanged()

+0

Я действительно удалил этот метод из своего кода, потому что он не работал, я добавил его обратно, но, как и в прошлый раз, он не работал. Я также добавил несколько операторов журналов, но никто из них не был зарегистрирован ... – user2405469

+0

также есть причина, когда я пытаюсь отлаживать, как и в моем массиве, он не вызван? – user2405469

+0

Должно быть вызвано, можете ли вы опубликовать свой код для блока unitlistadapter? –

Смежные вопросы