listview - Dynamically updating list view from XML file at server in Android -
i've xml file present @ server, want update list view using data present @ xml file in server , whenever data updated in xml, reflect automatically in list. i've code that's working fine separately when put same code in project won't work.
here code:
contactdetail.xml file parse
<contact-detail> <person> <name>anshul thakur</name> <phone>9882222225</phone> <email>anshul9@gmail.com</email> <image-url>https://anshulthakur939.000webhostapp.com/wp-admin/genesis_app_data/contact_data/me_small.jpg</image-url> </person> <person> <name>a thakur</name> <phone>988000005</phone> <email>anshulth9@gmail.com</email> <image-url>https://anshulthakur939.000webhostapp.com/wp-admin/genesis_app_data/contact_data/me_small.jpg</image-url> </person> <person> <name>arun thakur</name> <phone>988111115</phone> <email>anshulth9@gmail.com</email> <image-url>https://anshulthakur939.000webhostapp.com/wp-admin/genesis_app_data/contact_data/me_small.jpg</image-url> </person> <person> <name>sample</name> <phone>988222222</phone> <email>anshul939@gmail.com</email> <image-url>https://anshulthakur939.000webhostapp.com/wp-admin/genesis_app_data/contact_data/me_small.jpg</image-url> </person> <person> <name>sample</name> <phone>982222222</phone> <email>anshu9@gmail.com</email> <image-url>https://anshulthakur939.000webhostapp.com/wp-admin/genesis_app_data/contact_data/default.jpg</image-url> </person> sitesxmlpullparser.java
package com.atechgeek.genesis.xmlpullparser; import android.content.context; import com.atechgeek.genesis.helperobj.contactdetail; import org.xmlpull.v1.xmlpullparser; import org.xmlpull.v1.xmlpullparserfactory; import java.io.bufferedreader; import java.io.fileinputstream; import java.io.inputstreamreader; import java.util.arraylist; import java.util.list; /** * created anshul thakur on 7/27/2017. */ public class sitesxmlpullparser { static final string key_person = "person"; static final string key_name = "name"; static final string key_email = "email"; static final string key_phone = "phone"; static final string key_image_url = "image-url"; public static list<contactdetail> getcontactdetailfromfile(context ctx) { //list return list<contactdetail> contactdetails = new arraylist<contactdetail>(); // temp holder current <person> tag while parsing contactdetail curcontactdetail = null; // temp holder current text value in between opening , closing tags while parsing string curtext = ""; try { //get pull parser xmlpullparserfactory factory = xmlpullparserfactory.newinstance(); xmlpullparser parser = factory.newpullparser(); //get input file stream fileinputstream fileinputstream = ctx.openfileinput("contactdetail.xml"); //to read file bufferedreader reader = new bufferedreader(new inputstreamreader(fileinputstream)); //set file input xmlpullparser parser.setinput(reader); //get initial value of event int eventtype = parser.geteventtype(); //start loop events until reach end of document while(eventtype!=xmlpullparser.end_document) { //get current tag string tagname=parser.getname(); //handle diff eventtype switch (eventtype) { case xmlpullparser.start_tag: if (tagname.equalsignorecase(key_person)) { //if new contact there <person> ....</person> curcontactdetail = new contactdetail(); } break; case xmlpullparser.text: //grabs whole of data after starting tag use in end_tag curtext=parser.gettext(); break; case xmlpullparser.end_tag: if(tagname.equalsignorecase(key_person)) { //if </person> contact of 1 person fetched //add list of contacts contactdetails.add(curcontactdetail); } else if(tagname.equalsignorecase(key_name)) { //if </name> occurs set contactdetails name contact person name curcontactdetail.setname(curtext); } else if(tagname.equalsignorecase(key_phone)) { //if </phone> occurs curcontactdetail.setphone(long.parselong(curtext)); } else if(tagname.equalsignorecase(key_email)) { //if </email> occurs curcontactdetail.setemail(curtext); } else if(tagname.equalsignorecase(key_image_url)) { //if </image-url> occurs curcontactdetail.setimage_url(curtext); } break; default: break; } eventtype = parser.next(); } } catch (exception e){ e.printstacktrace(); } return contactdetails; } } downloader.java
package com.atechgeek.genesis.xmlpullparser; import android.util.log; import java.io.bufferedinputstream; import java.io.bufferedoutputstream; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.net.url; import java.net.urlconnection; /* * helper class downloading file. */ public class downloader { //tag log statements private static string mytag = "stacksites"; //handler msg represents posting progress update. static final int post_progress = 1; /************************************************ * download file internet , store locally * * @param url - url of file download * @param fos - fileoutputstream save downloaded file to. ************************************************/ public static void downloadfromurl(string url, fileoutputstream fos) { //this downloader method try { url url = new url(url); //url of file //keep start time can display how long took log. long starttime = system.currenttimemillis(); log.d(mytag, "download begining"); /* open connection url. */ urlconnection ucon = url.openconnection(); // useful can show tipical 0-100% progress bar //int lenghtoffile = ucon.getcontentlength(); log.i(mytag, "opened connection"); /************************************************ * define inputstreams read urlconnection. ************************************************/ inputstream = ucon.getinputstream(); bufferedinputstream bis = new bufferedinputstream(is); log.i(mytag, "got inputstream , bufferedinputstream"); /************************************************ * define outputstreams write our file. ************************************************/ bufferedoutputstream bos = new bufferedoutputstream(fos); log.i(mytag, "got fileoutputstream , bufferedoutputstream"); /************************************************ * start reading , writing our file. ************************************************/ byte data[] = new byte[1024]; //long total = 0; int count; //loop , read current chunk while ((count = bis.read(data)) != -1) { //keep track of size progress. //total += count; //write chunk bos.write(data, 0, count); } //have call flush or file can corrupted. bos.flush(); bos.close(); log.d(mytag, "download ready in " + ((system.currenttimemillis() - starttime)) + " milisec"); } catch (ioexception e) { log.d(mytag, "error: " + e); } } } contactlistadapter.java
package com.atechgeek.genesis.xmlpullparser; import android.content.context; import android.graphics.bitmap; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.arrayadapter; import android.widget.imageview; import android.widget.progressbar; import android.widget.relativelayout; import android.widget.textview; import com.atechgeek.genesis.helperobj.contactdetail; import com.atechgeek.genesis.r; import com.nostra13.universalimageloader.core.displayimageoptions; import com.nostra13.universalimageloader.core.imageloader; import com.nostra13.universalimageloader.core.imageloaderconfiguration; import com.nostra13.universalimageloader.core.assist.failreason; import com.nostra13.universalimageloader.core.assist.imageloadinglistener; import java.util.list; /** * created acer on 7/27/2017. */ public class contactlistadapter extends arrayadapter<contactdetail> { imageloader imageloader; displayimageoptions options; public contactlistadapter(context context, int resource, list<contactdetail> objects) { super(context, resource, objects); //setup imageloader, we'll use display our images imageloaderconfiguration config = new imageloaderconfiguration.builder(context).build(); imageloader = imageloader.getinstance(); imageloader.init(config); //setup options imageloader handle caching us. options = new displayimageoptions.builder() .cacheinmemory() .cacheondisc() .build(); } @override public view getview(int position, view convertview, viewgroup parent) { relativelayout row = (relativelayout)convertview; if(null==row) { //no recycled view.....create 1 layoutinflater inflater = (layoutinflater)parent.getcontext().getsystemservice(context.layout_inflater_service); row=(relativelayout)inflater.inflate(r.layout.row_site, null); } //get our view references final imageview iconimg = (imageview)row.findviewbyid(r.id.iconimg); textview txtname = (textview)row.findviewbyid(r.id.txtname); textview txtphoneno = (textview)row.findviewbyid(r.id.txtphone); textview txtemail = (textview)row.findviewbyid(r.id.txtemail); final progressbar indicator = (progressbar)row.findviewbyid(r.id.progress); //initially want progress indicator visible, , image invisible indicator.setvisibility(view.visible); iconimg.setvisibility(view.invisible); //setup listener can use swtich loading indicator image once it's ready imageloadinglistener listener = new imageloadinglistener() { @override public void onloadingstarted(string s, view view) { } @override public void onloadingfailed(string s, view view, failreason failreason) { } @override public void onloadingcomplete(string s, view view, bitmap bitmap) { indicator.setvisibility(view.invisible); iconimg.setvisibility(view.visible); } @override public void onloadingcancelled(string s, view view) { } }; //load image , use our options caching handled. imageloader.displayimage(getitem(position).getimage_url(), iconimg,options, listener); //set value of textviews txtname.settext(getitem(position).getname()); txtphoneno.settext(string.valueof(getitem(position).getphone())); txtemail.settext(getitem(position).getemail()); return row; } } contact detail.java
package com.atechgeek.genesis.helperobj; /** * created anshul thakur on 7/27/2017. */ public class contactdetail { private string name; private string email; private string image_url; private long phone; public void setname(string name) { this.name = name; } public string getname() { return name; } public string getemail() { return email; } public string getimage_url() { return image_url; } public long getphone() { return phone; } public void setemail(string email) { this.email = email; } public void setimage_url(string image_url) { this.image_url = image_url; } public void setphone(long phone) { this.phone = phone; } } now main activity contacts.java
package com.atechgeek.genesis; import android.content.context; import android.content.intent; import android.net.connectivitymanager; import android.net.networkinfo; import android.net.uri; import android.os.asynctask; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.view.view; import android.widget.adapterview; import android.widget.listview; import android.widget.progressbar; import com.atechgeek.genesis.xmlpullparser.sitesxmlpullparser; import com.atechgeek.genesis.xmlpullparser.downloader; import com.atechgeek.genesis.xmlpullparser.contactlistadapter; import java.io.filenotfoundexception; public class contacts extends appcompatactivity { private listview contactlist; private contactlistadapter madapter; private static progressbar bar; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_contacts); //to add button getsupportactionbar().setdisplayhomeasupenabled(true); contactlist = (listview)findviewbyid(r.id.contactpersonlist); bar = (progressbar)findviewbyid(r.id.progressbar); bar.setvisibility(view.visible); contactlist.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { long phonenumber = madapter.getitem(position).getphone(); intent intent = new intent(intent.action_dial, uri.parse("tel:(+91)"+phonenumber)); startactivity(intent); } }); /* * if network available download xml internet. * if not try use local file last time. */ if(isnetworkavailable()) { contactfiledownload download = new contactfiledownload(); download.execute(); } else { madapter = new contactlistadapter(getapplicationcontext(), -1, sitesxmlpullparser.getcontactdetailfromfile(contacts.this)); contactlist.setadapter(madapter); } } private boolean isnetworkavailable() { connectivitymanager connectivitymanager = (connectivitymanager)getsystemservice(context.connectivity_service); networkinfo activenetworkinfo = connectivitymanager.getactivenetworkinfo(); return activenetworkinfo != null && activenetworkinfo.isconnected(); } private class contactfiledownload extends asynctask<void, void, void> { @override protected void doinbackground(void... params) { //download file try { downloader.downloadfromurl("https://anshulthakur939.000webhostapp.com/wp-admin/genesis_app_data/contactdetail.xml", openfileoutput("contactdetail.xml", context.mode_private)); } catch (filenotfoundexception e) { e.printstacktrace(); } return null; } @override protected void onpostexecute(void result) { //setup our adapter , set listview. madapter = new contactlistadapter(contacts.this, -1, sitesxmlpullparser.getcontactdetailfromfile(contacts.this)); contactlist.setadapter(madapter); bar.setvisibility(view.invisible); } } } its xml activity_contacts.xml
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".contacts" > <progressbar android:id="@+id/progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerhorizontal="true" android:layout_centervertical="true" android:visibility="gone" /> <listview android:id="@+id/contactpersonlist" android:layout_width="match_parent" android:layout_height="match_parent" /> </relativelayout> and row_site.xml
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" > <progressbar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <imageview android:id="@+id/iconimg" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginright="8dp" /> <textview android:id="@+id/txtname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_torightof="@id/iconimg" android:textsize="16sp" android:textstyle="bold" /> <textview android:id="@+id/txtphone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_torightof="@id/iconimg" android:textsize="12sp" android:layout_below="@id/txtname" /> <textview android:id="@+id/txtemail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_torightof="@id/iconimg" android:textsize="12sp" android:layout_below="@id/txtphone" /> </relativelayout> androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.atechgeek.genesis"> <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.access_network_state" /> <application android:allowbackup="true" android:hardwareaccelerated="true" android:icon="@drawable/genesis" android:label="@string/app_name" android:largeheap="true" android:supportsrtl="true" android:theme="@style/apptheme"> <activity android:name=".splashactivity" android:hardwareaccelerated="false" android:screenorientation="portrait" android:theme="@style/activitytheme"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name=".home" /> <activity android:name=".welcomeactivity" android:screenorientation="portrait" android:theme="@style/activitytheme" /> <activity android:name=".signinactivity" android:hardwareaccelerated="false" android:screenorientation="portrait" android:theme="@style/activitytheme" /> <service android:name=".myfirebasemessaging"> <intent-filter> <action android:name="com.google.firebase.messaging_event" /> </intent-filter> </service> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/genesis" /> <activity android:name=".mynavdrawer" android:label="@string/title_activity_my_nav_drawer" android:screenorientation="portrait" android:theme="@style/apptheme.noactionbar" /> <activity android:name=".eventactivity" android:label="@string/title_activity_event" android:screenorientation="portrait" android:theme="@style/apptheme.noactionbar" /> <activity android:name=".eventdetailactivity" android:label="@string/title_activity_event_detail" android:screenorientation="portrait" android:theme="@style/apptheme.noactionbar" /> <activity android:name=".chatwindow" android:hardwareaccelerated="false" android:label="@string/chat_title" android:parentactivityname=".mynavdrawer"> <meta-data android:name="android.support.parent_activity" android:value="com.atechgeek.genesis.mynavdrawer" /> </activity> <activity android:name=".contacts" android:label="@string/contacts_title" android:parentactivityname=".mynavdrawer"> <meta-data android:name="android.support.parent_activity" android:value="com.atechgeek.genesis.mynavdrawer" /> </activity> </application> </manifest> if create new project , add these files there works fine when put in project not able work,.... fetches data once , never fetches data server.... here screenshot of project hierarchy ... hierarchy of project
Comments
Post a Comment