android - I am getting the items in Listview repeated . Here is my sample code I am unable to find the bug in my code ! Can anyone help me out please? -
//this joblistadapter class package com.example.hellotest.adapters; import java.text.parseexception; import java.text.simpledateformat; import java.util.list; import java.util.locale; import android.content.context; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.baseadapter; import android.widget.textview; import com.example.hellotest.r; import com.example.hellotest.model.job; public class joblistadapter extends baseadapter { private layoutinflater minflater ; private list<job> mjobs; private simpledateformat mdateformat; private simpledateformat minputformat; private string mposterprefix; public joblistadapter(context context) { minflater = (layoutinflater) context.getsystemservice(context.layout_inflater_service); mdateformat = new simpledateformat("dd mmmm yyyy", locale.us); minputformat = new simpledateformat("yyyy-mm-dd hh:mm:ss", locale.us); mposterprefix = context.getstring(r.string.job_posted_by); } public void setjoblist(list<job> jobs) { mjobs = jobs; } @override public int getcount() { if(null != mjobs) { return mjobs.size(); } return 0; } @override public object getitem(int position) { return mjobs.get(position); } @override public long getitemid(int position) { return mjobs.get(position).getid(); } //this method think problem please tell me. @override public view getview(int position, view convertview, viewgroup parent) { viewholder holder; if(null == convertview) { convertview = minflater.inflate(r.layout.job_list_row, null); holder = new viewholder(); holder.created = (textview) convertview.findviewbyid(r.id.job_listing_date); holder.location = (textview) convertview.findviewbyid(r.id.job_listing_location); holder.title = (textview) convertview.findviewbyid(r.id.job_listing_title); holder.experience = (textview) convertview.findviewbyid(r.id.job_listing_experience); holder.poster = (textview) convertview.findviewbyid(r.id.job_listing_posted_by); convertview.settag(holder); } else { holder = (viewholder) convertview.gettag(); } updaterow(holder, mjobs.get(position)); return convertview; } private void updaterow(viewholder holder, job job) { holder.title.settext(job.gettitle()); int id = job.ispremium() ? r.drawable.icon_premium : 0; holder.created.settext(getdate(job.getcreated())); holder.created.setcompounddrawableswithintrinsicbounds(0, 0, id, 0); holder.experience.settext(job.getexperience()); holder.location.settext(job.getlocation()); holder.poster.settext(mposterprefix + job.getposter()); } private charsequence getdate(string created) { try { return mdateformat.format(minputformat.parse(created)); } catch (parseexception e) { e.printstacktrace(); } return created; } private static class viewholder { textview created; textview title; textview location; textview experience; textview poster; } } // layout fragmentjob_listing make listview height fill_parent suggested when googled solution issue. <?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <linearlayout android:id="@+id/job_listing_filter_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/job_listing_tab_bg" android:gravity="center_vertical" android:minheight="48dp" > <textview android:id="@+id/job_listing_experience" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/selector_job_listing_tab" android:clickable="true" android:gravity="center" android:text="@string/job_listing_experience" /> <imageview android:id="@+id/space2" android:layout_width="1dp" android:layout_height="match_parent" android:contentdescription="@string/app_name" android:scaletype="fitxy" android:src="@drawable/job_listing_horizontal_divider" /> <textview android:id="@+id/job_listing_location" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/selector_job_listing_tab" android:clickable="true" android:gravity="center" android:text="@string/job_listing_location" /> </linearlayout> <imageview android:id="@+id/imageview1" android:layout_width="match_parent" android:layout_height="wrap_content" android:contentdescription="@string/app_name" android:scaletype="fitxy" android:src="@drawable/job_listing_divider" /> <textview android:id="@+id/job_listing_message" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:visibility="gone"/> <listview android:id="@+id/job_list" android:layout_width="fill_parent" android:layout_height="fill_parent"> </listview> </linearlayout> // joblistingfragment class joblistadapter class called package com.example.hellotest; import java.util.list; import android.app.activity; import android.content.intent; import android.os.bundle; import android.support.v4.app.fragment; import android.text.textutils; import android.view.layoutinflater; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.abslistview; import android.widget.abslistview.onscrolllistener; import android.widget.adapterview; import android.widget.adapterview.onitemclicklistener; import android.widget.listview; import android.widget.progressbar; import android.widget.textview; import android.widget.toast; import com.android.volley.request.method; import com.android.volley.requestqueue; import com.android.volley.response; import com.android.volley.response.errorlistener; import com.android.volley.response.listener; import com.android.volley.volleyerror; import com.android.volley.toolbox.volley; import com.example.hellotest.r; import com.example.hellotest.adapters.joblistadapter; import com.example.hellotest.config.constant; import com.example.hellotest.io.cookiestringrequest; import com.example.hellotest.io.json.jobsprocessor; import com.example.hellotest.model.job; import com.example.hellotest.model.joblist; import com.example.hellotest.model.pagination; import com.example.hellotest.tasks.jsonparsertask; import com.example.hellotest.tasks.jsonparsinglistener; import com.example.hellotest.util.accountutils; import com.example.hellotest.util.log; public class joblistingfragment extends fragment { public static final string arg_url = "argument_url"; public static final string arg_is_filter_on = "argument_is_filtered"; public static final string arg_is_default_job_list = "argument_is_default_job_list"; public static final string arg_empty_message = "argument_empty_message"; protected static final int request_experience = 0x11; protected static final int request_location = 0x12; private listview mjobslist; private textview mmessageview; private joblistadapter madapter; private list<job> mjobs; private pagination mpagination; private boolean misfetching; private boolean misdefaultlist; private boolean misfilteron; private string murl; private string mlocid; private int mexperienceid = -1; private progressbar mfooterprogress; private log mlogger = new log(joblistingfragment.class); private object mrequesttag = new object(); private requestqueue mrequestqueue; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); madapter = new joblistadapter(getactivity()); if (null != savedinstancestate) { getstate(savedinstancestate); } else { getstate(getarguments()); } // init(); } @override public void onattach(activity activity) { super.onattach(activity); mrequestqueue = volley.newrequestqueue(getactivity()); } @override public void ondetach() { mrequestqueue.cancelall(mrequesttag); super.ondetach(); } @override public void onresume() { init(); super.onresume(); } private void getstate(bundle bundle) { murl = bundle.getstring(arg_url); misfilteron = bundle.getboolean(arg_is_filter_on); misdefaultlist = bundle.getboolean(arg_is_default_job_list); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view view = inflater.inflate(r.layout.fragment_job_listing, null); mjobslist = (listview) view.findviewbyid(r.id.job_list); mmessageview = (textview) view.findviewbyid(r.id.job_listing_message); return view; } @override public void onviewcreated(view view, bundle savedinstancestate) { view footer = getlayoutinflater(savedinstancestate).inflate(r.layout.paginated_list_footer, null); mfooterprogress = (progressbar) footer.findviewbyid(r.id.footer_progress); if (!misfilteron) { view.findviewbyid(r.id.job_listing_filter_container).setvisibility(view.gone); } else { view.findviewbyid(r.id.job_listing_experience).setonclicklistener(monclicklistener); view.findviewbyid(r.id.job_listing_location).setonclicklistener(monclicklistener); } mjobslist.addfooterview(footer); mjobslist.setadapter(madapter); mjobslist.setonscrolllistener(monscrolllistener); mjobslist.setonitemclicklistener(monitemclicklistener); super.onviewcreated(view, savedinstancestate); } @override public void onsaveinstancestate(bundle outstate) { outstate.putstring(arg_url, murl); outstate.putboolean(arg_is_filter_on, misfilteron); outstate.putboolean(arg_is_default_job_list, misdefaultlist); super.onsaveinstancestate(outstate); } public void startafresh(string url, boolean ispaginated) { mlogger.d("old fragment reused"); misfilteron = true; murl = url; reset(); init(); } private void init() { mlocid = accountutils.getlocationfilter(); mexperienceid = accountutils.getexperiencefilter(); string url = geturl(1); fetchjobs(url); } private void reset() { mjobs = null; mpagination = null; madapter.setjoblist(null); madapter.notifydatasetchanged(); } private string geturl(int pagenumber) { string appender = ""; if (misfilteron) { if (null != mlocid || -1 < mexperienceid) { if (null != mlocid) { appender += "/loc-" + mlocid; } else { appender += "/loc-" + 0; } if (-1 < mexperienceid) { appender += "/exp-" + mexperienceid; } else { appender += "/exp-" + 0; } } } string url = murl + appender + "/pg-" + pagenumber; if (misdefaultlist && accountutils.isloggedin()) { url += "?" + constant.map_cookie_key + "=" + accountutils.getcookie(); } return url; } private void fetchjobs(string url) { misfetching = true; mlogger.d("url :" + url); int method = misdefaultlist ? method.get : method.post; cookiestringrequest request = new cookiestringrequest(method, url, mlistener, merrorlistener); request.settag(mrequesttag); mrequestqueue.add(request); } private response.listener<string> mlistener = new listener<string>() { @override public void onresponse(string response) { mlogger.d("response :" + response); jsonparsertask<joblist> jsontask = new jsonparsertask<joblist>(new jobsprocessor()); jsontask.setlistener(mjsonlistener); jsontask.execute(response); } }; private response.errorlistener merrorlistener = new errorlistener() { @override public void onerrorresponse(volleyerror error) { misfetching = false; toast.maketext(getactivity(), r.string.network_error, toast.length_long).show(); } }; private jsonparsinglistener<joblist> mjsonlistener = new jsonparsinglistener<joblist>() { @override public void onsuccess(joblist result) { if (null == mpagination) { mpagination = result.getpagination(); mpagination.setcurrentpage(0); if(null == result.getjobs() || 0 == result.getjobs().size()) { mmessageview.settext(getarguments().getstring(arg_empty_message)); mmessageview.setvisibility(view.visible); } else { mmessageview.setvisibility(view.gone); } } else { mpagination.updatedata(result.getpagination()); } if (null != mjobs) { mjobs.addall(result.getjobs()); } else { mjobs = result.getjobs(); } madapter.setjoblist(mjobs); madapter.notifydatasetchanged(); misfetching = false; } @override public void onfailure(exception e) { toast.maketext(getactivity(), "unable process response", toast.length_long).show(); misfetching = false; } }; private onitemclicklistener monitemclicklistener = new onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { job job = (job) madapter.getitem(position); intent intent = new intent(getactivity(), jobdetailsactivity.class); intent.putextra(jobdetailsactivity.extra_job, job); startactivity(intent); } };
// function found might cause problem because when scrolls down items in list repeated. private onscrolllistener monscrolllistener = new onscrolllistener() {
@override public void onscrollstatechanged(abslistview view, int scrollstate) { } @override public void onscroll(abslistview view, int firstvisibleitem, int visibleitemcount, int totalitemcount) { boolean loadmore = firstvisibleitem + visibleitemcount >= totalitemcount; if (loadmore && totalitemcount > 0 && null != mpagination) { boolean islastpage = mpagination.getcurrentpage() >= mpagination.gettotalpages(); if (islastpage) { mfooterprogress.setvisibility(view.gone); } if (!misfetching && !islastpage) { fetchjobs(geturl(mpagination.getcurrentpage()+1)); } } } }; public void onactivityresult(int requestcode, int resultcode, intent data) { if (activity.result_ok == resultcode) { switch (requestcode) { case request_experience: onexperienceselection(data); break; case request_location: onlocationselection(data); break; } } }
add 1 more line in function:
mjob.clear(); private jsonparsinglistener<joblist> mjsonlistener = new jsonparsinglistener<joblist>() { @override public void onsuccess(joblist result) { if (null == mpagination) { mpagination = result.getpagination(); mpagination.setcurrentpage(0); if(null == result.getjobs() || 0 == result.getjobs().size()) { mmessageview.settext(getarguments().getstring(arg_empty_message)); mmessageview.setvisibility(view.visible); } else { mmessageview.setvisibility(view.gone); } } else { mpagination.updatedata(result.getpagination()); } if (null != mjobs) { mjobs.clear(); mjobs.addall(result.getjobs()); } else { mjobs = result.getjobs(); } madapter.setjoblist(mjobs); madapter.notifydatasetchanged(); misfetching = false; }
Comments
Post a Comment