Как не выгружать из памяти неактивные Fragment?

186
21 декабря 2018, 02:00

Часть из MainActivity для загрузки Fragment's:

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new FragmentNews(), "Новости");
    adapter.addFragment(new FragmentNonGroup(), "Общие вопросы");
    adapter.addFragment(new FragmentAlt(), "Альтернатива");
    adapter.addFragment(new FragmentLifeUbd(), "Жизнь с ВЗК");
    adapter.addFragment(new FragmentFood(), "Питание");
    adapter.addFragment(new FragmentSport(), "Спорт");
    viewPager.setAdapter(adapter);
}

Код первого Fragment (остальные по аналогии):

public class FragmentNews extends Fragment {
    final ArrayList<NewsClass> newsList = new ArrayList<>();
    public Elements title;
    public Elements description;
    public Elements date;
    public Elements link;
    public Elements category;
    DrawerLayout drawer;
    int page = 1;
    String siteUrl = "***";
    private NewsAdapter adapter;
    private ListView lv;
    private FloatingActionButton fab;
    View v;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.listview, container, false);
        fab = v.findViewById(R.id.fab1);

        return v;
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        lv = v.findViewById(R.id.news_list);
        adapter = new NewsAdapter(getActivity(), newsList);
        new NewThread().execute();
        Toast.makeText(getActivity(), "Загрузка статей", Toast.LENGTH_SHORT).show();
    }
    public class NewThread extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... arg) {
            try {
                Document doc;
                doc = Jsoup.connect(siteUrl + page).get();
                title = doc.select("div.td_module_5 > div > .entry-title");
                description = doc.select("div.td_module_5 > div > .td-excerpt");
                date = doc.select("div.td-module-meta-info > .td-post-date");
                link = doc.select("div.td_module_5 > div > .entry-title > a");
                category = doc.select("div.td_module_5 > div > .td-post-category");
                newsList.clear();
                for (int i = 0; i < title.size() && i < date.size() && i < link.size() && i < category.size(); i++) {
                    newsList.add(new NewsClass(title.get(i).text(), date.get(i).text(), link.get(i).attr("href"), category.get(i).text()));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(String result) {
            fab.show();
            lv = v.findViewById(R.id.news_list);
            lv.setVisibility(View.VISIBLE);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    fab.hide();
                    lv.setVisibility(View.INVISIBLE);
                    Toast.makeText(getActivity(), "Загрузка статей", Toast.LENGTH_SHORT).show();
                    newsList.clear();
                    page = page + 1;
                    new NewThread().execute();
                }
            });
            if (newsList.size() == 0) {
                fab.hide();
                Toast.makeText(getActivity(), "Других статей в этой категории нет", Toast.LENGTH_SHORT).show();
                newsList.clear();
                page = page - 1;
                new NewThread().execute();
            }
            lv.setAdapter(adapter);
            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                    NewsClass tempWord = (NewsClass) adapterView.getItemAtPosition(position);
                    String contentTitle = tempWord.getmTitle();
                    String contentDate = tempWord.getmDate();
                    String contentUrl = tempWord.getmUrl();
                    String contentCategory = tempWord.getmCategory();
                    Intent intent = new Intent(getActivity(), NewsContent.class);
                    intent.putExtra("TITLE_KEY", contentTitle);
                    intent.putExtra("DATE_KEY", contentDate);
                    intent.putExtra("URL_KEY", contentUrl);
                    intent.putExtra("CATEGORY_KEY", contentCategory);
                    startActivity(intent);
                }
            });
        }
}}

При запуске приложения запускаются вкладки с фрагментами (для навигации перелистыванием влево-вправо) через TabLayout. Все данные во фрагментах грузятся с Интернета через Jsoup. Так вот в чем проблема - всегда загружаются данные с двух соседних фрагментов. При переходе на третий фрагмент данные с первого выгружаются из памяти, и при возврате на первый фрагмент они заново загружаются из сети.

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

Может через сохранение\восстановление с базы данных в методах onPause и onResume?

Answer 1

Необходимо было условие при запуске фрагмента. В итоге - при запуске проверка массива newsList на наличие в нем элементов. Если элементы есть - просто присваиваем listview ранее созданный adapter:

lv.setAdapter(adapter);

И за ним уже весь нужный нам для работы с этим listview код.

Если newsList = 0, то запускаем загрузку через Jsoup.

Готовый код первого Fragment:

public class FragmentNews extends Fragment {
final ArrayList<NewsClass> newsList = new ArrayList<>();
public Elements title;
public Elements description;
public Elements date;
public Elements link;
public Elements category;
DrawerLayout drawer;
int page = 1;
String siteUrl = "***";
private NewsAdapter adapter;
private ListView lv;
private FloatingActionButton fab;
View v;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.listview, container, false);
    fab = v.findViewById(R.id.more);
    lv = v.findViewById(R.id.news_list);
    adapter = new NewsAdapter(getActivity(), newsList);
    if (newsList.size() == 0) {
        new NewThread().execute();
        Toast.makeText(getActivity(), "Загрузка статей", Toast.LENGTH_SHORT).show();
    } else {
        fab.show();
        lv = v.findViewById(R.id.news_list);
        lv.setVisibility(View.VISIBLE);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fab.hide();
                lv.setVisibility(View.INVISIBLE);
                Toast.makeText(getActivity(), "Загрузка статей", Toast.LENGTH_SHORT).show();
                newsList.clear();
                page = page + 1;
                new NewThread().execute();
            }
        });
        if (newsList.size() == 0) {
            fab.hide();
            Toast.makeText(getActivity(), "Других статей в этой категории нет", Toast.LENGTH_SHORT).show();
            newsList.clear();
            page = page - 1;
            new NewThread().execute();
        }
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                NewsClass tempWord = (NewsClass) adapterView.getItemAtPosition(position);
                String contentTitle = tempWord.getmTitle();
                String contentDate = tempWord.getmDate();
                String contentUrl = tempWord.getmUrl();
                String contentCategory = tempWord.getmCategory();
                Intent intent = new Intent(getActivity(), NewsContent.class);
                intent.putExtra("TITLE_KEY", contentTitle);
                intent.putExtra("DATE_KEY", contentDate);
                intent.putExtra("URL_KEY", contentUrl);
                intent.putExtra("CATEGORY_KEY", contentCategory);
                startActivity(intent);
            }
        });
    }
    return v;
}
public class NewThread extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... arg) {
        try {
            Document doc;
            doc = Jsoup.connect(siteUrl + page).get();
            title = doc.select("div.td_module_5 > div > .entry-title");
            description = doc.select("div.td_module_5 > div > .td-excerpt");
            date = doc.select("div.td-module-meta-info > .td-post-date");
            link = doc.select("div.td_module_5 > div > .entry-title > a");
            category = doc.select("div.td_module_5 > div > .td-post-category");
            newsList.clear();
            for (int i = 0; i < title.size() && i < date.size() && i < link.size() && i < category.size(); i++) {
                newsList.add(new NewsClass(title.get(i).text(), date.get(i).text(), link.get(i).attr("href"), category.get(i).text()));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(String result) {
        fab.show();
        lv = v.findViewById(R.id.news_list);
        lv.setVisibility(View.VISIBLE);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fab.hide();
                lv.setVisibility(View.INVISIBLE);
                Toast.makeText(getActivity(), "Загрузка статей", Toast.LENGTH_SHORT).show();
                newsList.clear();
                page = page + 1;
                new NewThread().execute();
            }
        });
        if (newsList.size() == 0) {
            fab.hide();
            Toast.makeText(getActivity(), "Других статей в этой категории нет", Toast.LENGTH_SHORT).show();
            newsList.clear();
            page = page - 1;
            new NewThread().execute();
        }
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                NewsClass tempWord = (NewsClass) adapterView.getItemAtPosition(position);
                String contentTitle = tempWord.getmTitle();
                String contentDate = tempWord.getmDate();
                String contentUrl = tempWord.getmUrl();
                String contentCategory = tempWord.getmCategory();
                Intent intent = new Intent(getActivity(), NewsContent.class);
                intent.putExtra("TITLE_KEY", contentTitle);
                intent.putExtra("DATE_KEY", contentDate);
                intent.putExtra("URL_KEY", contentUrl);
                intent.putExtra("CATEGORY_KEY", contentCategory);
                startActivity(intent);
            }
        });
    }
}}

Спасибо @woesss за наводку.

READ ALSO
Элемент Toolbar-a с счётчиком

Элемент Toolbar-a с счётчиком

Делаю кнопку toolbar-a с счётчиком, но когда я налаживаю на элемент свое поле в меню, при помощи:

186
Как выбрать элемент по тексту?

Как выбрать элемент по тексту?

Внутри div есть label с текстомНадо выбрать этот div

199
Помогите реализовать градиент через css

Помогите реализовать градиент через css

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

259