Задержка onCreateView () фрагмента - PullRequest
0 голосов
/ 26 апреля 2018

Мой код извлекает данные через загрузчик из Интернета, который передается во фрагмент через пакет и затем должен отображаться в представлении фрагмента.

Проблема в том, что onCreateView () -фрамента fgrament вызывается до того, как мои данные готовы, поэтому аргументы комплектов равны нулю.

Как я могу отложить этот процесс, чтобы данные были готовы при вызове onCreateView () ?

Я пытаюсь опубликовать только необходимый код, скажите, если вам нужно больше.

PS. Первоначально я пытался передать весь фрагмент List NewsEntry фрагменту, но это ужасно не получилось, поэтому мне пришлось преобразовать его в StringArray, чтобы поместить его в пакет. Если бы вы могли сказать мне лучший способ передать этот список фрагменту, я тоже был бы очень благодарен:)

Спасибо

SpinnerActivity.java

@Override
public void onItemSelected(
        AdapterView<?> parent, 
        View view, 
        int position, 
        long id
) {
    mQuery = parent.getItemAtPosition(position).toString();
    buildQuery();
    loaderManager.destroyLoader(0);
    Loader loader = loaderManager.initLoader(0, null, this);
}

public void onLoadFinished(
        Loader<List<NewsEntry>> loader, 
        List<NewsEntry> fetchedNewsEntries
) {
    Bundle bundle = new Bundle();
    ArrayList<String> newsEntriesArrayList = new ArrayList<>();

    ...

    bundle.putStringArrayList("newsEntries", newsEntriesArrayList);
    NewsEntryFragment fragment = new NewsEntryFragment();
    fragment.setArguments(bundle);
}

NewsEntryFragment.java

public NewsEntryFragment() {}

public static void newInstance(int columnCount) {

    NewsEntryFragment fragment = new NewsEntryFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_COLUMN_COUNT, columnCount);
    fragment.setArguments(args);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
    }
}

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

    if (getArguments() != null) {
        ArrayList<String> newsEntriesStringArrayList = 
            new ArrayList<>(
                Objects.requireNonNull( 
                    getArguments().getStringArrayList( "newsEntries" ) 
                )
            )
        ;

        ArrayList<NewsEntry> newsEntriesArrayList = new ArrayList<>();
            for (int i = 0; i < newsEntriesStringArrayList.size(); i++){
                StringBuilder builder = new StringBuilder();
                String sArray[];
                sArray = newsEntriesStringArrayList.get(i).split(",");
                NewsEntry newsEntry = 
                    new NewsEntry(
                        sArray[0], 
                        sArray[1], 
                        sArray[2], 
                        sArray[3], 
                        sArray[4]
                    )
                ;

                newsEntriesArrayList.add(newsEntry);
            }
    }


    // Set the adapter
    if (view instanceof RecyclerView) {
        Context context = view.getContext();
        RecyclerView recyclerView = (RecyclerView) view;
        if (mColumnCount <= 1) {
            recyclerView.setLayoutManager(new LinearLayoutManager(context));
        } else {
            recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
        }
        recyclerView
            .setAdapter(
                new MyNewsEntryRecyclerViewAdapter(
                    mNewsEntries, 
                    mListener
                )
            )
        ;
    }
    return view;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnListFragmentInteractionListener) {
        mListener = (OnListFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnListFragmentInteractionListener");
    }
}

activity_main.xml

    ...

    <FrameLayout
    android:id="@+id/main_fragment_holder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize">

    <fragment android:name="com.example.bjonic.guardiannewsfeed.NewsEntryFragment"
        android:id="@+id/headlines_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Сделайте интерфейсный обратный вызов в вашем фрагменте и вызовите интерфейс, как только задача будет завершена

0 голосов
/ 26 апреля 2018

Сдвиг кода для получения данных из onCreateView () в onViewCreated () и для отправки arrayList вам нужно сделать класс NewsEntry Parcelable, а затем вы можете сделать следующее -

    args.putParcelableArrayList("list", yourList);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...