即使在notifyItemInserted调用之后,RecyclerView新行也不会显示

时间:2018-01-10 15:58:21

标签: android android-recyclerview

我尝试了很多方法,但无法让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,但没有运气。

2 个答案:

答案 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的情况下工作。

谢谢大家的帮助!