SavedInstance нескольких пользовательских представлений внутри одного фрагмента - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть несколько экземпляров одного и того же CustomView внутри одного фрагмента.Я реализовал saveInstance для этого CustomView, но проблема в том, что существует несколько экземпляров этого CustomView, savedInstance из последнего переопределяет их все.

, например, если есть 3 экземпляра этого CustomView, который имеетЕсли я прокручу последний, то это относится ко всем.потому что я использую пары ключ-значение, и ключ одинаков для всех из них.(Я могу изменить ключ, чтобы он отличался для каждого, но я думаю, что есть лучший способ)

Вот код для сохранения и восстановления saveInstance внутри моего CustomView:

 @Nullable
@Override
protected Parcelable onSaveInstanceState() {
    Bundle bundle = new Bundle();
    bundle.putParcelable(SavedInstanceKey.SUPERSTATE.name(), super.onSaveInstanceState());
    bundle.putParcelable(SavedInstanceKey.RECYCLERVIEW.name(), recyclerView.getLayoutManager().onSaveInstanceState()); // ... save stuff
    return bundle;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    if (state instanceof Bundle) // implicit null check
    {
        Bundle bundle = (Bundle) state;
        this.recyclerView.getLayoutManager().onRestoreInstanceState(bundle.getParcelable(SavedInstanceKey.RECYCLERVIEW.name())); // ... load stuff
        state = bundle.getParcelable(SavedInstanceKey.SUPERSTATE.name());
    }
    super.onRestoreInstanceState(state);
}

и здесьэто OnCreateView моего фрагмента:

  @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_artist, container, false);

    final GridListView gv_new = view.findViewById(R.id.gridlist_new_songs);
    final GridListView gv_best = view.findViewById(R.id.gridlist_best);
    final GridListView gv_singles = view.findViewById(R.id.gridlist_singles);
    final GridListView gv_feats = view.findViewById(R.id.gridlist_feats);
    final RecyclerView rc_albums = view.findViewById(R.id.rcview_album);

    if(!alreadyInitialized) {
        alreadyInitialized = true;
        apiService = new ApiService(getContext());
        try {
            artistID = getArguments().getString(KeyIntent.ARTIST.name());
        } catch (Exception e) {
            Log.e(TAG, "onCreateView: Artist Fragment doesnt have args.\t", e);
        }

        apiService.getArtist(artistID, new ApiService.OnArtistReceived() {
            @Override
            public void onSuccess(Artist artist) {
                ArtistFragment.this.artist=artist;
                setArtistToViews(artist, view);
            }

            @Override
            public void onFail() {
                Toast.makeText(getContext(), "Error on receiving artist.", Toast.LENGTH_LONG).show();
            }
        });

        apiService.getNewSongs(artistID, new ApiService.OnSongsReceived() {
            @Override
            public void onSuccess(List<Song> songs) {
                ArtistFragment.this.newSongs=songs;
                List<GridListable> gridListables = new ArrayList<>();
                gridListables.addAll(songs);
                gv_new.load(gridListables, 1);
            }

            @Override
            public void onFail(ApiService.ApiResponse response) {
                Toast.makeText(getContext(), "Error on receiving artist.", Toast.LENGTH_LONG).show();
            }
        });

        apiService.getBestSongs(artistID, new ApiService.OnSongsReceived() {
            @Override
            public void onSuccess(List<Song> songs) {
                ArtistFragment.this.bestSongs=songs;
                List<GridListable> gridListables = new ArrayList<>();
                gridListables.addAll(songs);
                gv_best.load(gridListables, 1);
            }

            @Override
            public void onFail(ApiService.ApiResponse response) {
                Toast.makeText(getContext(), "Error on receiving artist.", Toast.LENGTH_LONG).show();
            }
        });

        apiService.getSingleSongs(artistID, new ApiService.OnSongsReceived() {
            @Override
            public void onSuccess(List<Song> songs) {
                ArtistFragment.this.singleSongs=songs;
                List<GridListable> gridListables = new ArrayList<>();
                gridListables.addAll(songs);
                gv_singles.load(gridListables, 1);
            }

            @Override
            public void onFail(ApiService.ApiResponse response) {

            }
        });

        apiService.getFeats(artistID, new ApiService.OnSongsReceived() {
            @Override
            public void onSuccess(List<Song> songs) {
                ArtistFragment.this.feats=songs;
                List<GridListable> gridListables = new ArrayList<>();
                gridListables.addAll(songs);
                gv_feats.load(gridListables, 1);
            }

            @Override
            public void onFail(ApiService.ApiResponse response) {

            }
        });

        apiService.getAlbums(artistID, new ApiService.OnAlbumsReceived() {
            @Override
            public void onSuccess(List<Album> albums) {
                ArtistFragment.this.albums=albums;

                List<Projective> projectives = new ArrayList<>();
                projectives.addAll(albums);
                rc_albums.setAdapter(new AlbumAdapter(getContext(), projectives));
                rc_albums.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, true));
            }

            @Override
            public void onFail(ApiService.ApiResponse response) {
                Toast.makeText(getContext(), "Loading albums failed.", Toast.LENGTH_SHORT).show();
            }
        });
    }else {
        Log.i(TAG, "onCreateView: Fragment already initialized, restoring from existing artist");
        setArtistToViews(artist,view);
        gv_new.load(new ArrayList<>(newSongs),1);
        gv_best.load(new ArrayList<>(bestSongs),1);
        gv_singles.load(new ArrayList<>(singleSongs),1);
        gv_feats.load(new ArrayList<>(feats),1);
        rc_albums.setAdapter(new AlbumAdapter(getContext(), new ArrayList<>(albums)));
        rc_albums.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, true));
    }
    return view;
}

1 Ответ

0 голосов
/ 24 сентября 2018

Я думаю, что проблема в Ключах, которые вы используете для своих Пакетов.Все ваши экземпляры пользовательского представления используют один и тот же SavedInstanceKey.SUPERSTATE.name().

Вы можете попробовать, чтобы фрагмент передавал разные ключи каждому из пользовательских представлений (BEST, NEW ...).Таким образом, каждый из ваших GridView имеет свой уникальный ключ для использования в методах saveInstanceState и restoreInstanceState.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...