Как сохранить данные ArrayList и использовать их в AutoCompleteTextView после изменения ориентации устройства - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть tride saveInstanceState , и это действительно помогает сохранять данные, но AutoCompleteTextView не видит какие-либо данные (в журнале я вижу, что данные существуют, и ониправильно) Затем я меняю ориентацию во второй раз и в журнале см. ArrayList = null ;вот некоторый код

  ...
    public class AddDayActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> 
    ...
    ArrayAdapter<String> adapter;
    private AutoCompleteTextView edit_day_name; 
    private ArrayList<String> autoCompleteList;
    private ArrayList<Integer> autoCompleteListPrice;
    ...
     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.add_pay_day);
             autoCompleteList = new ArrayList<String>(); //Array list witch need to save 
             autoCompleteListPrice = new ArrayList<Integer>();//Array list witch need to save 

    ...
        edit_day_name = findViewById(R.id.edit_day_name); //AutoCompleteTextView
    ...
    if (savedInstanceState != null) {
            autoCompleteList.addAll(Objects.requireNonNull(savedInstanceState.getStringArrayList("BundleAutoCompleteList")));
            autoCompleteListPrice.addAll(Objects.requireNonNull(savedInstanceState.getIntegerArrayList("BundleAutoCompleteListPrice")));
            Log.d(UtilContract.LOG_KEY, " onRestoreInstanceState Working " + savedInstanceState.getIntegerArrayList("BundleAutoCompleteList")
                    + "\n" +
                    savedInstanceState.getIntegerArrayList("BundleAutoCompleteListPrice")
                    + "\n" + autoCompleteList + "\n" + autoCompleteListPrice);


        } 
            adapter = new ArrayAdapter<String>(this,
                    R.layout.dropdown_menu_popup_item, autoCompleteList);
            Log.d(UtilContract.LOG_KEY, ".." + autoCompleteList);
            edit_day_name.setAdapter(adapter);

        ...
         LoaderManager.getInstance(this).initLoader(NAME_UNIC_LOADER, null, this);
        ...
         @Override
        protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        //Save data in  Bundle
        outState.putStringArrayList("BundleAutoCompleteList", autoCompleteList);
        outState.putIntegerArrayList("BundleAutoCompleteListPrice", autoCompleteListPrice);
        Log.d(UtilContract.LOG_KEY, " savedInstanceState Save " + autoCompleteListPrice + "\n" + autoCompleteList);
    }

Загрузчик для заполнения массива из базы данных SQL

 @NonNull
    @Override
    public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
        String[] projection = {
                UtilContract.KEY_ID,
                KEY_NAME_DETAIL,
                KEY_PRICE_OF_DETAIL
        };

        CursorLoader cursorLoader = new CursorLoader(this,
                UtilContract.DetailTable.CONTENT_URI,
                projection,
                null,
                null,
                KEY_NAME_DETAIL
        );
        Log.d(LOG_KEY, " CursorLoader  DetailTable " + cursorLoader);
        return cursorLoader;
    }
      @Override
    public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
        int count = data.getCount();
        if (autoCompleteList.isEmpty() || autoCompleteListPrice.isEmpty()) {
            //
            while (data.moveToNext()) {
                autoCompleteList.add(data.getString(data.getColumnIndexOrThrow(KEY_NAME_DETAIL)));
                autoCompleteListPrice.add(data.getInt(data.getColumnIndexOrThrow(KEY_PRICE_OF_DETAIL)));
            }
        } else {
            //
            autoCompleteList.clear();
            autoCompleteListPrice.clear();
            // 
            while (data.moveToNext()) {
                autoCompleteList.add(data.getString(data.getColumnIndexOrThrow(KEY_NAME_DETAIL)));                autoCompleteListPrice.add(data.getInt(data.getColumnIndexOrThrow(KEY_PRICE_OF_DETAIL)));
            }
        }
        Log.d(LOG_KEY, " Cursor  DetailTable " + data + " count " + count);
    }

    @Override
    public void onLoaderReset(@NonNull Loader<Cursor> loader) {
 adapter.clear();
    }

В этой ситуации как правильно сохранить данные для AutoComplateView?

PS: Я использую"androidx" и".material: 1.1.0-alpha09" для создания из AutoComplateView "ExposedDropdownMenu"

1 Ответ

1 голос
/ 26 сентября 2019

Слишком мало кода, чтобы сказать наверняка, но из того, что я вижу, проблема может быть в реализации Loader и его синхронизации с остальным кодом.

Loaded загружает данные асинхронно.Это означает, что после того, как вы повернули устройство, ваш код работал хорошо, но загрузчик снова начал загружаться.Перед тем, как загрузка фактически началась, она вызывает onLoaderReset, который содержит adapter.clear() call.Таким образом, все данные с адаптера исчезают, поэтому AutocompleteTextView нечего показать.

Также в методе onLoadFinished я вижу, что вы извлекаете данные, но не устанавливаете их в адаптер - поэтому адаптер пуст.

Еще раз - я не уверен, что этопричина в том, что код неполон, но я надеюсь, что он вам как-то поможет.

...