Использование метода setUserVisibleHint () - PullRequest
0 голосов
/ 19 мая 2018

У меня есть этот фрагмент.

public class USATodayFragment extends Fragment implements LoaderManager.LoaderCallbacks<Object> {

private Boolean isStarted = false;
private Boolean isVisible = false;

private static final String LOG_TAG = USATodayFragment.class.getName();
private static final int NEWS_LOADER_ID = 0;
private String newsUrl;

private RecyclerView mRecyclerView;
private NewsAdapter adapter;
private TextView errorTextView;

private static final String ARRAY_LIST = "list_view";
private ArrayList<News> newsArrayList;
private static final String LAYOUT_STATE = "USATodayFragment.recycler.layout";

String newsTitlesToJson;
public USATodayFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.common_fragment_layout, container, false);


    if(savedInstanceState == null) {
        newsArrayList = new ArrayList<>();

        mRecyclerView = v.findViewById(R.id.news_recycler_view);
        errorTextView = v.findViewById(R.id.errorTextView);
        LinearLayoutManager manager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getActivity()));
        adapter = new NewsAdapter(getActivity(), newsArrayList);
        mRecyclerView.setAdapter(adapter);

        getLoaderManager().initLoader(NEWS_LOADER_ID, null, this);

        UpdateNewsWidgetService.startBakingService(getContext(), (ArrayList<News>) newsArrayList);



    }else{
        newsArrayList = savedInstanceState.getParcelableArrayList(ARRAY_LIST);
        errorTextView = v.findViewById(R.id.errorTextView);
        mRecyclerView = v.findViewById(R.id.news_recycler_view);
        LinearLayoutManager manager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getActivity()));
        adapter = new NewsAdapter(getActivity(), newsArrayList);
        mRecyclerView.setAdapter(adapter);

        UpdateNewsWidgetService.startBakingService(getContext(), (ArrayList<News>) newsArrayList);


    }


    return v;
}

@Override
public Loader onCreateLoader(int id, Bundle args) {

    if(id == NEWS_LOADER_ID){
        newsUrl = "https://newsapi.org/v2/top-headlines?sources=usa-today&apiKey=98b995b151264acdb35e751ff6d22a3c";

    }

    return new USATodayLoader(getActivity(),newsUrl);
}



@Override
public void onLoaderReset(Loader<Object> loader) {

}

@Override
public void onLoadFinished(Loader<Object> loader, Object data) {
    int id = loader.getId();

    if(id == NEWS_LOADER_ID){
        newsArrayList = (ArrayList<News>)data;

        if(newsArrayList !=null && !newsArrayList.isEmpty()){
            adapter.clear();
            adapter.setNewsData(newsArrayList);

            newsTitlesToJson = new Gson().toJson(newsArrayList);

            PreferenceManager.getDefaultSharedPreferences(getActivity())
                    .edit().putString("news",newsTitlesToJson)
                    .apply();

            Log.v(LOG_TAG, newsTitlesToJson);


        }else{
            showError();
        }
    }
}
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelableArrayList(ARRAY_LIST,newsArrayList);
    //outState.putParcelable(LAYOUT_STATE, mRecyclerView.getLayoutManager().onSaveInstanceState());
}

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

    if(savedInstanceState != null)
    {
        Parcelable savedRecyclerLayoutState = savedInstanceState.getParcelable(LAYOUT_STATE);
        mRecyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerLayoutState);

    }
}

public void showError(){
    mRecyclerView.setVisibility(View.GONE);
    errorTextView.setVisibility(View.VISIBLE);
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
}

}

По сути, он загружает некоторые данные в onCreateLoader и отображает их внутри onLoadFinished .Все, что я хочу сделать, это если фрагмент виден, запрос завершен.Но я запутался в этом, когда дело касается setUserVisibleHint ()

Любая помощь по этому поводу?

Спасибо,

Тео.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Во фрагменте setUserVisibleHint() вызовет метод before oncreate.

Вы можете объявить глобальную переменную и вызвать onCreateView() во фрагменте

View view;

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

        // return view
        return view;
    }

Затем вы можете вызвать setUserVisibleHint() вот так

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        // check condition 
        if (isResumed() && isVisibleToUser) {
            //do stuff
        }
    }

Надеюсь, это поможетВы!

0 голосов
/ 19 мая 2018

Вы можете сделать что-то вроде этого

@Override
public void onLoadFinished(Loader<Object> loader, Object data) {
      int id = loader.getId();

      if(id == NEWS_LOADER_ID){
            newsArrayList = (ArrayList<News>)data;       
      }
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
   super.setUserVisibleHint(isVisibleToUser);
   if (isVisibleToUser && isResumed()) {
        if(newsArrayList !=null && !newsArrayList.isEmpty()){
            adapter.clear();
            adapter.setNewsData(newsArrayList);

            newsTitlesToJson = new Gson().toJson(newsArrayList);

            PreferenceManager.getDefaultSharedPreferences(getActivity())
                    .edit().putString("news",newsTitlesToJson)
                    .apply();

            Log.v(LOG_TAG, newsTitlesToJson);


        }else{
            showError();
        }
   }
}
...