android - How to continue read content in ListView after bottom swipe? -
i have used swipyrefreshlayout here, because need update data when listview on , continue reading content after downloading. have problem - after bottom swipe focus of application going listview top. have endless posts in listview, need continue reading after downloading them. should change this? can me?
this code of application
public class mainactivity extends appcompatactivity implements navigationview.onnavigationitemselectedlistener, swipyrefreshlayout.onrefreshlistener { private static final string tag = "mainactivity"; private static final int layout = r.layout.activity_main; private static final string url = "http://killpls.me"; private static final string url_moderation = "http://killpls.me/moderation/"; private toolbar toolbar; private drawerlayout drawerlayout; private navigationview navigationview; private actionbardrawertoggle toggle; private floatingactionbutton fab; private progressdialog progressdialog; private swipyrefreshlayout mswipyrefreshlayout; private newpostsasynctask newpostsasynctask; private moderationasynctask moderationasynctask; public elements content; public arraylist<string> titlelist = new arraylist<string>(); private arrayadapter<string> adapter; private listview listview; private int navigationdraweritemid; private boolean isrefreshed = false; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(layout); inittoolbar(); initnavigationview(); initactionbardrawertoggle(); // Добавляет возможность открыть navigationdrawer через значок initfloatingactionbutton(); initswiperefreshlayout(); listview = (listview) findviewbyid(r.id.listview); } private void inittoolbar() { toolbar = (toolbar) findviewbyid(r.id.toolbar); setsupportactionbar(toolbar); toolbar.setonmenuitemclicklistener(new toolbar.onmenuitemclicklistener() { @override public boolean onmenuitemclick(menuitem item) { return false; } }); } private void initnavigationview() { drawerlayout = (drawerlayout) findviewbyid(r.id.drawer_layout); navigationview = (navigationview) findviewbyid(r.id.nav_view); navigationview.setnavigationitemselectedlistener(this); } private void initactionbardrawertoggle() { toggle = new actionbardrawertoggle(this, drawerlayout, toolbar, r.string.navigation_drawer_open, r.string.navigation_drawer_close); drawerlayout.setdrawerlistener(toggle); toggle.syncstate(); } private void initfloatingactionbutton() { fab = (floatingactionbutton) findviewbyid(r.id.fab); fab.setonclicklistener(new view.onclicklistener() { @override public void onclick(view view) { snackbar.make(view, "replace own action", snackbar.length_long) .setaction("action", null).show(); } }); } private void initswiperefreshlayout() { mswipyrefreshlayout = (swipyrefreshlayout) findviewbyid(r.id.swipyrefreshlayout); mswipyrefreshlayout.setonrefreshlistener(this); mswipyrefreshlayout.setcolorschemeresources(android.r.color.holo_blue_bright, android.r.color.holo_green_light, android.r.color.holo_orange_light, android.r.color.holo_red_light); } @override public void onbackpressed() { drawerlayout drawer = (drawerlayout) findviewbyid(r.id.drawer_layout); if (drawer.isdraweropen(gravitycompat.start)) { drawer.closedrawer(gravitycompat.start); } else { super.onbackpressed(); } } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.main, menu); return true; } @override public boolean onoptionsitemselected(menuitem item) { // handle action bar item clicks here. action bar // automatically handle clicks on home/up button, long // specify parent activity in androidmanifest.xml. int id = item.getitemid(); //noinspection simplifiableifstatement if (id == r.id.action_settings) { return true; } return super.onoptionsitemselected(item); } @suppresswarnings("statementwithemptybody") @override public boolean onnavigationitemselected(menuitem item) { // handle navigation view item clicks here. navigationdraweritemid = item.getitemid(); if (navigationdraweritemid == r.id.new_posts) { log.i(tag, "Выбрано раздел \"Новые\" в navigation drawer"); adapter = new arrayadapter<string>(this, r.layout.list_item, r.id.item, titlelist); isrefreshed = false; newpostsasynctask = new newpostsasynctask(); newpostsasynctask.execute(); if (!adapter.isempty()) adapter.clear(); } else if (navigationdraweritemid == r.id.moderation) { log.i(tag, "Выбрано раздел \"Модерация\" в navigation drawer"); adapter = new arrayadapter<string>(this, r.layout.list_item, r.id.item, titlelist); isrefreshed = false; moderationasynctask = new moderationasynctask(); moderationasynctask.execute(); if (!adapter.isempty()) adapter.clear(); } else if (navigationdraweritemid == r.id.tell_story) { log.i(tag, "Выбрано раздел \"Рассказать историю\" в navigation drawer"); adapter = new arrayadapter<string>(this, r.layout.list_item, r.id.item, titlelist); if (!adapter.isempty()) adapter.clear(); } else if (navigationdraweritemid == r.id.most_terrible_stories) { log.i(tag, "Выбрано раздел \"Самые страшные\" в navigation drawer"); adapter = new arrayadapter<string>(this, r.layout.list_item, r.id.item, titlelist); if (!adapter.isempty()) adapter.clear(); } else if (navigationdraweritemid == r.id.random_story) { log.i(tag, "Выбрано раздел \"Случайная\" в navigation drawer"); adapter = new arrayadapter<string>(this, r.layout.list_item, r.id.item, titlelist); if (!adapter.isempty()) adapter.clear(); } else if (navigationdraweritemid == r.id.happy_end) { log.i(tag, "Выбрано раздел \"happy end\" в navigation drawer"); adapter = new arrayadapter<string>(this, r.layout.list_item, r.id.item, titlelist); if (!adapter.isempty()) adapter.clear(); } else if (navigationdraweritemid == r.id.about_project) { log.i(tag, "Выбрано раздел \"О проекте\" в navigation drawer"); adapter = new arrayadapter<string>(this, r.layout.list_item, r.id.item, titlelist); if (!adapter.isempty()) adapter.clear(); } else if (navigationdraweritemid == r.id.help_all) { log.i(tag, "Выбрано раздел \"Хочу помочь всем\" в navigation drawer"); adapter = new arrayadapter<string>(this, r.layout.list_item, r.id.item, titlelist); if (!adapter.isempty()) adapter.clear(); } drawerlayout drawer = (drawerlayout) findviewbyid(r.id.drawer_layout); drawer.closedrawer(gravitycompat.start); return true; } @override public void onrefresh(swipyrefreshlayoutdirection direction) { new handler().postdelayed(new runnable() { @override public void run() { if (navigationdraweritemid == r.id.new_posts) { log.i(tag, "Обновленно раздел \"Новые\" в navigation drawer"); isrefreshed = true; newpostsasynctask = new newpostsasynctask(); newpostsasynctask.execute(); } else if (navigationdraweritemid == r.id.moderation) { log.i(tag, "Обновленно раздел \"Модерация\" в navigation drawer"); isrefreshed = true; moderationasynctask = new moderationasynctask(); moderationasynctask.execute(); } else if (navigationdraweritemid == r.id.tell_story) { log.i(tag, "Обновленно раздел \"Рассказать историю\" в navigation drawer"); } else if (navigationdraweritemid == r.id.most_terrible_stories) { log.i(tag, "Обновленно раздел \"Самые страшные\" в navigation drawer"); } else if (navigationdraweritemid == r.id.random_story) { log.i(tag, "Обновленно раздел \"Случайная\" в navigation drawer"); } else if (navigationdraweritemid == r.id.happy_end) { log.i(tag, "Обновленно раздел \"happy end\" в navigation drawer"); } else if (navigationdraweritemid == r.id.about_project) { log.i(tag, "Обновленно раздел \"О проекте\" в navigation drawer"); } else if (navigationdraweritemid == r.id.help_all) { log.i(tag, "Обновленно раздел \"Хочу помочь всем\" в navigation drawer"); } else { log.i(tag, "Попытка обновить главную страницу"); } // Когда обновление закончено, вызываем метод setrefreshing(boolean) и передаем ему false. mswipyrefreshlayout.setrefreshing(false); } }, 4000); } class newpostsasynctask extends asynctask<string, void, string> { @override protected void onpreexecute() { super.onpreexecute(); if (!isrefreshed) { progressdialog = new progressdialog(mainactivity.this); progressdialog.settitle("Новые"); progressdialog.setmessage("Загрузка..."); progressdialog.setindeterminate(false); progressdialog.show(); } } @override protected string doinbackground(string... params) { document doc; try { doc = jsoup.connect(url).get(); // Считываем заголовок страницы // Получение номера страницы селектором и преобразование его в число elements pagespan = doc.select("div.paginator > span:first-child"); int pagecount = integer.parseint(pagespan.first().text()); // Стоит еще проверить, что элементы нашлись, вызовом !pagespan.isempty(), // first() для пустого списка возвращает null. (int = pagecount; > 0; i--) { string pagecountstring = integer.tostring(i); doc = jsoup.connect("http://killpls.me/page/" + pagecountstring).get(); parsedocument(doc); if (i == 1697) { break; // Ограничение до 1697 страницы, чтобы не лагало. Надо исправить. } } } catch (ioexception e) { e.printstacktrace(); // Если не получилось считать } return null; } public void parsedocument(document doc) { // Парсит посты на странице content = doc.select("[style=margin:0.5em 0;line-height:1.785em]"); (element contents : content) { if (!contents.text().contains("18+")) { // Выводит только посты без ссылки на 18+ titlelist.add(contents.text()); } } } @override protected void onpostexecute(string s) { super.onpostexecute(s); listview.setadapter(adapter); if (navigationdraweritemid == r.id.new_posts) progressdialog.dismiss(); } } class moderationasynctask extends asynctask<string, void, string> { @override protected void onpreexecute() { super.onpreexecute(); if (!isrefreshed) { progressdialog = new progressdialog(mainactivity.this); progressdialog.settitle("Модерация"); progressdialog.setmessage("Загрузка..."); progressdialog.setindeterminate(false); progressdialog.show(); } } @override protected string doinbackground(string... params) { document doc; try { doc = jsoup.connect(url_moderation).get(); parsedocument(doc); } catch (ioexception e) { e.printstacktrace(); } return null; } public void parsedocument(document doc) { // Парсит посты на странице content = doc.select("[style=margin:0.5em 0;line-height:1.785em]"); (element contents : content) { titlelist.add(contents.text()); } } @override protected void onpostexecute(string s) { super.onpostexecute(s); listview.setadapter(adapter); if (navigationdraweritemid == r.id.moderation) progressdialog.dismiss(); } } }
here in code:
moderationasynctask protected void onpostexecute(string s) { super.onpostexecute(s); listview.setadapter(adapter); if (navigationdraweritemid == r.id.new_posts) progressdialog.dismiss(); } after asynctask executed, reset listview's adapter make date of listview invalidated. that's totally new dataset listview whatever contained really. information of items(like position) lost because of adapter changed.
consider of using arraryadater.notifydatasetchanged() when date of adapter changed.
Comments
Post a Comment