Часть из 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
?
Необходимо было условие при запуске фрагмента. В итоге - при запуске проверка массива 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 за наводку.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Делаю кнопку toolbar-a с счётчиком, но когда я налаживаю на элемент свое поле в меню, при помощи:
Подскажите как сделать такой градиент, что бы к углам он становился полностью прозрачный