Android: Cannot update Listview with CustomAdapter

I need to update the list view with new data. This code below is used to retrieve data in OnCreateView , which is in FragmentActivity for the first time.

 override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { val url = "something" val request_queue = Volley.newRequestQueue(this.context) val stringRequest = StringRequest(Request.Method.GET, url, Response.Listener<String> { response -> val pending_job = Gson().fromJson<ArrayList<HashMap<String, String>>>( response.toString(), object : TypeToken<ArrayList<HashMap<String, String>>>() {}.type ) this@PlaceholderFragment.showList (rootView, R.id.pending_job_list, pending_job) pending_job_list_layout.setOnRefreshListener(this) request_queue.stop() }, Response.ErrorListener { error -> if (error.networkResponse != null) { Toast.makeText(this.context, error.networkResponse.statusCode.toString(), Toast.LENGTH_SHORT).show() } request_queue.stop() }) request_queue.add(stringRequest) } 

showList is a function to install a CustomAdapter that

 fun showList(rootView: View, tab_id: Int, job_list: ArrayList<HashMap<String, String>>) { // custom display ListView val adapter: CustomAdapter = CustomAdapter( this.context, job_list ) this_adapter = adapter val listView = rootView.findViewById(tab_id) as ListView listView.adapter = adapter } 

and this CustomAdapter class,

 class CustomAdapter(internal var mContext: Context, internal var job_list: ArrayList<HashMap<String, String>> ) : BaseAdapter() { override fun getCount(): Int { return job_list.size } override fun getItem(position: Int): Any? { return null } override fun getItemId(position: Int): Long { return 0 } override fun getView(position: Int, view: View?, parent: ViewGroup): View { val mInflater = mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val item_view = mInflater.inflate(R.layout.activity_job_item, parent, false) val job_name: MutableList<String> = arrayListOf() job_list.mapTo(job_name) { it["BaseSiteName"] as String } val nameView: TextView = item_view.findViewById(R.id.name) as TextView nameView.text = job_name[position] val job_date: MutableList<String> = arrayListOf() job_list.mapTo(job_date) { it["PlanDt"] as String} val dateView: TextView = item_view.findViewById(R.id.date) as TextView dateView.text = job_date[position] item_view.setOnClickListener{ val intent: Intent = Intent(mContext, JobDetailActivity::class.java) intent.putExtra("job", job_list[position]) mContext.startActivity(intent) } return item_view } 

}

However, I want the list to be updated. I wrote the following code to update the list.

 override fun onRefresh() { Toast.makeText(this.context, "Refresh", Toast.LENGTH_SHORT).show() val rootView = this_inflater!!.inflate(R.layout.fragment_pending_job, this_container, false) val url = "something" val request_queue = Volley.newRequestQueue(this.context) val stringRequest = StringRequest(Request.Method.GET, url, Response.Listener<String> { response -> val pending_job = Gson().fromJson<ArrayList<HashMap<String, String>>>( response.toString(), object : TypeToken<ArrayList<HashMap<String, String>>>() {}.type ) val adapter: CustomAdapter = CustomAdapter( this.context, pending_job ) val listView = rootView.findViewById(R.id.pending_job_list) as ListView listView.adapter = adapter pending_job_list_layout.isRefreshing = false pending_job_list_layout.setOnRefreshListener(this) request_queue.stop() }, Response.ErrorListener { error -> if (error.networkResponse != null) { Toast.makeText(this.context, error.networkResponse.statusCode.toString(), Toast.LENGTH_SHORT).show() } request_queue.stop() }) request_queue.add(stringRequest) } 

This simply creates an instance of the CustomAdapter and returns it to the list again.

When I update, nothing in the list changes.

+6
source share
2 answers

Define the UpdateData method in the CustomAdapter class that will receive new data and replace old data

 fun UpdateData(new_job_list: ArrayList<HashMap<String, String>>){ job_list.clear() job_list.addAll(new_job_list) notifyDataSetChanged() } 

Now when you get new data from volly, instead of having to install the adapter for listview again, just use

 adapter.UpdateData(pending_job) 
0
source

1.Way: You can make a background listener using Asynctask . You can listen to your server in a continuous loop. When the data has changed, you can update the listview . This method is simple, but not suitable for performance.

2.Way: You can use firebase database. Because it works in real time.

3.Way: If you do not want to change your database. You can use Google Cloud Messaging . You must implement this both on the server and on your application. When the data has changed on the server, listen and send the message with cloud messages to the Android application. And update the list view automatically.

0
source

Source: https://habr.com/ru/post/1014727/


All Articles