Android: невозможно обновить Listview с помощью CustomAdapter

Мне нужно обновить представление списка новыми данными. Этот код ниже используется для получения данных в OnCreateView который находится в FragmentActivity в первый раз.

 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 – это функция для установки CustomAdapter, которая

 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 } 

, И этот класс CustomAdapter ,

 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 } 

}

Однако я хочу сделать список обновленным. Я написал следующий код, чтобы обновить список.

 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) } 

Это просто создает экземпляр CustomAdapter снова возвращает его в список.

Когда я обновляюсь, ничего в списке не меняется.

Определите метод UpdateData в классе CustomAdapter, который получит новые данные и заменит старые данные

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

Теперь, когда вы получаете новые данные из volly, вместо того, чтобы снова устанавливать адаптер для listview, используйте

 adapter.UpdateData(pending_job) 

1.Way: вы можете сделать фоновый прослушиватель с помощью Asynctask Вы можете прослушивать ваш сервер в непрерывном цикле. Когда данные изменились, вы можете обновить список. Этот способ прост, но не хорош для производительности.

2.Way: вы можете использовать базу данных firebase. Потому что она работает в реальном времени.

3.Way: Если вы не хотите менять свою базу данных. Вы можете использовать Google Cloud Messaging Вы должны реализовать это, как на сервере, так и на своем приложении. Когда данные изменились на сервере, слушайте и отправляйте сообщение с облачными сообщениями в приложение Android. И обновите Автоматически.

Intereting Posts
Android Facebook SDK: Key hash не соответствует сохраненным хэшам при загрузке google play Ошибка при выходе из памяти при запуске приложения «Активность в приложении Android»? Android Spinner Gravity Не работает Кордова Камера для съемки нескольких фотографий один за другим Android Realm copyToRealmOrUpdate обновляет существующие поля Android onServiceConnected () вызывается в отдельном потоке? Как я могу заставить приложение Android общаться с веб-сервером через Интернет? Android: Как изменить фокус на форме без участия пользователя? Является ли OAuth на мобильном телефоне с помощью прокси-сервера слишком много неприятностей? Android, как определить элемент в списке с помощью флажка Как добавить параметры в api (http post), используя библиотеку okhttp в Android Используйте JsonReader.setLenient (true), чтобы принять неверный JSON в строке 1, столбец 1 путь $ Как добавить classpath в проект Android Studio Android CountDownTimer показывает 1 в течение двух секунд AppCompat 23.2 использует VectorDrawableCompat с RemoteViews (AppWidget) в API <21