我尝试了很多方法,但无法让RecyclerView
显示新行。
这是我的适配器:
private inner class MyAdapter : RecyclerView.Adapter<MyViewHolder>() {
override fun getItemCount(): Int {
LogDog.i(TAG, "getItemCount=" + _to.size)
return _to.size
}
override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
LogDog.i(TAG, "Binding row $position of size=" + _to.size)
val contactId = _to[position]
holder?._tv_name?.text = DB.getString(TblContact, TblContact._display, contactId)
holder?._tv_address?.text = DB.getString(TblContact, TblContact._address, contactId)
holder?._position = position
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder {
LogDog.i(TAG, "onCreateViewHolder, size=" + _to.size)
return MyViewHolder(activity.layoutInflater.inflate(R.layout.r_to, parent, false))
}
}
点击联系人button
后,会显示联系人对话框以选择并调用_adListener
添加行:
private val _to = ArrayList<Long>()
private var _adapter = MyAdapter()
private val _addListener : (Long) -> Unit = { id ->
_to.add(id)
Log.i(TAG, "_addListener size=" + _to.size)
//_adapter.notifyItemInserted(_to.size - 1)
_adapter.notifyDataSetChanged()
}
private val _addClicker = View.OnClickListener { _ ->
DlgContactEdit(activity, null, null, _addListener).show()
}
private val _lookupClicker = View.OnClickListener { _ ->
DlgContactSelector(activity, _addListener).show()
}
从日志中,我确实看到_addListener
已被调用,但新行未显示!仅当布局刷新(例如,键盘显示和隐藏)时,新行才会显示在_to
列表中的真实内容中。可能是什么原因?
我还尝试使用Handler稍后调用notifyItemInserted
,或者更改为notifyDataSetChanged
,但没有运气。
答案 0 :(得分:0)
与许多教程相反,notifyChange本身不起作用,最重要的是你需要刷新回收器视图.invalidate()。
这是我的一个类中的函数示例,可以从不同的地方调用以刷新我的RV。
/**
* Sets up the recycler view and refreshes it after data changes
*/
private void setUpView() {
Schedule_AddTimes_Adapter adapter = new Schedule_AddTimes_Adapter(mTimesList);
RecyclerView.ItemDecoration divider = new DividerItemDecoration(ContextCompat.getDrawable(mContext, R.drawable.divider));
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
mDoseTimesList.setLayoutManager(linearLayoutManager);
mDoseTimesList.setAdapter(adapter);
mDoseTimesList.addItemDecoration(divider);
mDoseTimesList.invalidate();
}
答案 1 :(得分:0)
抱歉我的愚蠢错误。刚刚注意到我根本没有使用_adapter,我正在写这个
rv_to.adapter = MyAdapter()
这是完全错误的。
它可以在不调用invalidate的情况下工作。
谢谢大家的帮助!