6

kullanarak liste görünümünü yenileyemiyor Liste görünümünü yeni verilerle yenilemem gerekiyor. Aşağıdaki kod, ilk defa FragmentActivity numaralı OnCreateView numaralı veriyi elde etmek için kullanılır. Android: 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

Ancak, liste yapmak istiyorum

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 
} 

olduğunu CustomAdapter ayarlamak için fonksiyon, ve bu CustomAdapter sınıf,

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 
} 

}

olduğunu yenilemek-edebiliyoruz. Listeyi yenilemek için aşağıdaki kodu yazdım.

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

sadece tekrar CustomAdapter başlatmasını ve tekrar liste görünümü götürün olup olmadığını.

Yenilediğimde listedeki hiçbir şey değiştirilmedi.

+0

Yenileme sırasında parça görünümünüzü neden artırıyorsunuz? OnCreateView() 'parçasında şişirmelisiniz. Muhtemelen Response.Listener öğesindeki listenView Reference'ı yanlış kökten (yani yeni şişirdiğinizden) aldınız ve bu nedenle güncelleştirme görünmüyor. (Ekranınız eski rootView kullanıyor ve buna hiçbir şey yapmadınız). –

+1

Bu kötü bir uygulama, neden ArrayList'i veriyle birlikte kullanmıyorsunuz ve tekrar ayarlamıyorsunuz? Bunun gibi: adapter.job_list = pending_job ve sonra notifyDataSetChanged() çağrısı? – mayosk

+0

Sadece 'adapter.job_list 'öğesini onRefresh'e ekledikten sonra' adapter.notifyDataSetChanged() 'olarak adlandırıyorum, bu yüzden işe yarar! Bana yardım ettiğin için herkese teşekkür ederim. – gameraroma

cevap

0

yeni veri almak ve yerini edecek CustomAdapter sınıfında bir yöntem UpdateData tanımlayın eski veri

Şimdi yerine liste görünümü için tekrar adaptörü ayarlama volly gelen yeni veriler, sadece kullanma aldığımda
fun UpdateData(new_job_list: ArrayList<HashMap<String, String>>){ 
     job_list.clear() 
     job_list.addAll(new_job_list) 
     notifyDataSetChanged() 
    } 

adapter.UpdateData(pending_job) 
0

1.Way: Sen .Arzu listview .Bu şekilde yenileyebilirsiniz senden daha değişti bir döngü continuous.When verilerinde sunucuya dinleyebilirsiniz Asynctask ile arka plan dinleyici yapmak kolay ama performans için iyi değil edebilirsiniz.

2.Way: firebase veritabanını kullanabilirsiniz. Çünkü gerçek zamanlı çalışıyor.

3.Way: Veritabanınızı değiştirmek istemezseniz, Google Cloud Messaging kullanabilirsiniz. Bunu, hem sunucu hem de uygulamanızı uygulamanız gerekir. Veriler sunucuda değiştiğinde dinlemek ve android uygulaması için bulut mesajlaşma ile ileti göndermek .Ve otomatik olarak list view yenileyin.