6

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

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 
        ) 
        [email protected](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 снова и принять его к ListView снова.

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

+0

Почему вы завываете свой фрагмент при освежении? вы должны раздуть его на 'onCreateView()' part. Возможно, вы взяли ссылку listView в своем Response.Listener из неправильного корня (т. Е. Того, который вы недавно надули), и поэтому обновление не появляется. (На вашем экране используется старый rootView, и вы ничего не сделали с ним). –

+1

это плохая реализация, почему вы не делаете ArrayList с данными общедоступными и устанавливаете их снова? Я имею в виду вот так: adapter.job_list = pending_job, а затем вызывает notifyDataSetChanged()? – mayosk

+0

Я просто добавляю 'adapter.job_list' в' onRefresh', а затем вызываю 'adapter.notifyDataSetChanged()', поэтому он работает! Спасибо всем за помощь. – gameraroma

ответ

0

Определите метод 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) 
0

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

2.Way: Вы можете использовать базу данных firebase.Because, это работает в режиме реального времени.

3.Way: Если вы не хотите изменить свой database.You можно использовать Google Cloud Messaging .Вы должны осуществить это, как сервер и ваши данные application.When изменен на сервере слушать и отправить сообщение с облаком сообщениями на Android App . И обновить list view автоматически.

 Смежные вопросы

  • Нет связанных вопросов^_^