6

新しいデータでリストビューを更新する必要があります。以下のコードは、初めてFragmentActivityにあるOnCreateViewのデータを取得するために使用します。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

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 
} 

}

しかし、私はリストを作りたいですCustomAdapterを設定する機能ですリフレッシュ可能。私はリストをリフレッシュするために次のコードを書いた。

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を再びインスタンス化し、再びリストビューに取り込みます。

リフレッシュすると、リスト内の何も変更されません。

+0

なぜあなたはリフレッシュ時にフラグメントビューを膨らませますか?あなたは 'onCreateView()'の部分にそれを膨張させるべきです。おそらく、間違ったルート(つまり、新たに膨らませたもの)からResponse.ListenerのlistView参照を取得したため、更新が表示されません。 (あなたの画面は古いrootViewを使用していて、何もしませんでした)。 –

+1

これは実装が悪いので、なぜデータをpublicにしてArrayListを作成せず、再度設定するのですか?私はこのように意味:adapter.job_list = pending_jobし、notifyDataSetChanged()を呼び出しますか? – mayosk

+0

'adapter.job_list'を' onRefresh'に追加してから、 'adapter.notifyDataSetChanged()'を呼び出すだけです。皆さんありがとうございました。 – gameraroma

答えて

0

だけ

adapter.UpdateData(pending_job) 
を使用し、新たなデータを受信しますCustomAdapterクラスのメソッド UpdateDataを定義し、あなたがvollyから新しいデータを取得するときに今、古いデータ

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

を置き換え、代わりに、リストビューのために再度アダプタを設定します

0

1.Way: あなたは。あなたがlistview .This道をリフレッシュすることができますよりも、変化したループcontinuous.Whenデータ内のサーバーを聴くことができAsynctaskと背景リスナーを作る簡単ですが、パフォーマンスのために良いではありませんすることができます。

2.Way: firebaseデータベースを使用することができます。リアルタイムで動作しているためです。

3.Way: あなたのdatabase.Youは。あなたがこれを実装する必要がありますGoogle Cloud Messagingを使用することができます変更したくない場合は、サーバーとapplication.Whenデータの両方がサーバー上で変更耳を傾け、Androidアプリにクラウドメッセージングとメッセージを送信そして、list viewを自動的にリフレッシュします。

関連する問題