【问题标题】:RecyclerView items disappears after soft keyboard popupRecyclerView 项目在软键盘弹出后消失
【发布时间】:2020-07-14 04:19:59
【问题描述】:

这里是 Kotlin 新手,遇到了这个问题 -

我有一个带有回收器视图的片段,其中包含列表 - ListsFragment,在我的测试用例中它包含 6 个列表。 单击列表将调用第二个 Fragment - ItemsFragment。 ItemsFragment 显示一个 EditText 和回收器,其中项目属于列表,在我的测试用例中,每个列表 2 个项目。

在ItemsFragment的onCreateView中,我是用这段代码来获取ListsFragment的回收器-

val fragManager = activity?.supportFragmentManager
val frag = fragManager?.findFragmentByTag("tag_main")
listsRecycler = (frag?.view as View).lists_recycler_view

在 Debug 中查看 listRecycler 时,一切看起来都不错,我可以看到 6 个列表 - listRecycler at onCreateView of ItemsFragment

在我按回车键并在 Debug 中再次查看 listRecycler 后,现在我只能看到 4 个列表 - listRecycler at setOnKeyListener of ItemsFragment

我有一个“理论”为什么会发生 - 当显示这两个项目时,它们位于 ListFragment 的 6 个列表的顶部,当我单击 EditText 时弹出软键盘并从 ListFragment 中“擦除”最后 2 个列表,这可能吗?

ItemsFragment完整代码-

class ItemsFragment : Fragment()  {
lateinit var viewAdapter: RecyclerView.Adapter<*>
var table1 = mutableListOf<Items>()
lateinit var toolbar  : Toolbar
lateinit var theView  : View
lateinit var listsRecycler : RecyclerView

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    theView = inflater.inflate(R.layout.fragment_items, container, false)

    var txt_add_item = theView.findViewById<EditText>(R.id.txt_add_item)

    txt_add_item.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
        if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP) {
            makeToast()
            true
        }
        false
    })

    val fragManager = activity?.supportFragmentManager
    val frag = fragManager?.findFragmentByTag("tag_main")
    listsRecycler = (frag?.view as View).lists_recycler_view

    return theView
}

fun makeToast() {
    Toast.makeText(context, "Enter Key Pressed", Toast.LENGTH_SHORT).show()
}

override fun onStart () {
    super.onStart()
    var anItem = Items()
    anItem.itemName = "Item 1"
    table1.add(0, anItem)

    anItem = Items()
    anItem.itemName = "Item 2"
    table1.add(1, anItem)
    viewAdapter = ItemsAdapter(table1)
    items_recycler_view.adapter = viewAdapter
}

ListFragment 的适配器 -

class ListsAdapter(private val logList: MutableList<Lists>) : RecyclerView.Adapter<ListsAdapter.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
    return ViewHolder(view)
}

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val txvLog : TextView = itemView.findViewById(R.id.txt_list_name)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.txvLog.text = logList[position].listName

    holder.itemView.setOnClickListener { v ->
        val context = v.context
        val activity = context as AppCompatActivity
        var fragment = ItemsFragment()
        activity.supportFragmentManager
            .beginTransaction()
            .add((R.id.frame_layout), fragment, "tag_list")
            .commit()
    }
}

override fun getItemCount(): Int { return logList.size }

}

【问题讨论】:

    标签: android kotlin android-recyclerview android-softkeyboard


    【解决方案1】:

    男人。欢迎来到stackoverflow。基本上这是因为内容必须对新的屏幕尺寸做出反应。我建议你阅读这个问题RecyclerView behavior - Goes empty when keyboard is opened/closed 它可能会帮助你。基本上建议是:a)保存状态 b)添加一些代码到清单。

    【讨论】:

    • 谢谢!你是对的,这可能是发生了什么,我的活动中已经有“AdjustPan”,但这个问题仍然出现在我的片段中......
    • 如果您在 onstart 方法中使用以下代码行,它可能会修复它:adapter.submitList(yourlist)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多