android - Kotlin RecyclerView 无法正常工作

标签 android android-recyclerview kotlin

我想创建一个小应用程序,一旦用户点击 float 按钮操作就可以添加元素。会自动添加 到回收 View 的顶部。

我为此创建了一个主要 Activity ,其中包含回收器的 fragment 和 add flotten。

一旦用户单击此按钮,就会显示一个 fragment 对话框以插入元素。一旦用户确认我想将新元素添加到回收 View 的顶部。

我是否使用了包含该项目的全局数组。

我还没有为此实现逻辑。但是,当我单击显示的对话框的确认按钮时,令我感到惊讶的是,该元素已正确添加到全局数组中,然而,回收 View 自己没有任何操作就复制了最新的元素。

我为此使用了模型 View 展示器,这是我的差异类

1.MainActivity

   class MainActivity : AppCompatActivity() {
                override fun onCreate(savedInstanceState: Bundle?) {
                    super.onCreate(savedInstanceState)
                    setContentView(R.layout.activity_main)
                    addFragment(InterFragment(), R.id.container)
                    fab.setOnClickListener { view ->
                        val dialog = IntervAddFragment()
                        val ft = supportFragmentManager.beginTransaction()
                        dialog.show(ft, ContentValues.TAG)
                    }
                }
            }

2.ADDFragmet

class IntervAddFragment : DialogFragment(), AddContract.View
{
   val presenter: AddPresenter by lazy { AddPresenter(this) }
    var dat=""
    var plom=""
    var typ=""

    override fun onCreate(savedInstanceState: Bundle?) { ....}

    override fun onStart() {.... }
    override fun onCreateView(inflater: LayoutInflater?, parent: ViewGroup?, state: Bundle?): View? {...}
    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {....}
    fun  on_confirmClick()
    {
        presenter.on_confirmClick(dat,plom,typ)
        Log.e("errrr",presenter.getList().toString())
        dismiss()
    }

    fun fillSpinerPlom(view : View?) {....    }
    fun fillSpinerType(view : View?) {....    }

    private fun updateDateInView(datep:String) {....}
}

3.IntervFragement

 InterFragment: Fragment(), InterContract.View {

      var views: View? = null
         var List_inter_adapter: InterListAdapter? = null
        private var recyclerView: RecyclerView? = null
        val presenter: InterventionPresenter by lazy { InterventionPresenter(this) }

        override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                                  savedInstanceState: Bundle?): View? {.... }

        interface ClickListener {
            fun onClick(view: View, position: Int)
            fun onLongClick(view: View?, position: Int)
        }

        internal class RecyclerTouchListener(context: Context, recyclerView: RecyclerView, private val clickListener: ClickListener?) : RecyclerView.OnItemTouchListener {..... }

            override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {.....}
        override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            recyclerView = views!!.findViewById<View>(R.id.interv_item_listview) as RecyclerView
            List_inter_adapter = InterListAdapter(activity, presenter.getList(true))
            recyclerView!!.adapter = List_inter_adapter
            recyclerView!!.layoutManager = LinearLayoutManager(activity)

       }
    }

4.InterPresenter

class InterventionPresenter(val view: InterContract.View)
{
    fun getList(firstTime:Boolean): LinkedList<InterItem> {
       if(firstTime)
           return populateList().list
        else
           return items
    }

    fun populateList(): ListInter
    {
        val item1 = InterItem(1, DateT(2018, Calendar.FEBRUARY, 6).date, plomb.get(0), types.get(0))
        val  item2 = InterItem(2, DateT(2018, Calendar.MARCH, 8).date, plomb.get(1), types.get(1))
        val item3= InterItem(3, DateT(2018, Calendar.MAY, 10).date, plomb.get(2), types.get(2))
        val lstint = ListInter()
        lstint.list= LinkedList(listOf(item1, item2, item3))
        items=lstint.list
        return lstint
    }


    companion object {

        val plomb= LinkedList<String>(listOf("Dina", "Lili", "Wiseem"))
        val types= LinkedList<String>(listOf("type1","type2","type3"))
        lateinit var items: LinkedList<InterItem>
    }

}

5.添加演示者

class AddPresenter(val view: AddContract.View)
{
    fun on_confirmClick(date:String,plom:String,type:String)
    {
        val item= InterItem(items.size+1,date,plom,type)
            items.push(item)

    }
    fun getList(): LinkedList<InterItem> {
        return items
    }

    fun getplom(): LinkedList<String>
    { return plomb
    }
    fun getType(): LinkedList<String>
    { return types
    }
}

6.InterListAdapter

class InterListAdapter(private val context: Context, linkedList: LinkedList<InterItem>) : RecyclerView.Adapter<InterListAdapter.ViewHolder>()
{
    internal var  linkedList = LinkedList<InterItem>()
    private val inflater: LayoutInflater
    //private lateinit var listener: OnTaskSelected
    init {... }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {... }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.numero?.text=(linkedList[position].numero).toString()
        holder.date?.text=linkedList[position].date
        holder.plom?.text=linkedList[position].plom
        holder.type?.text=linkedList[position].type
    }
    override fun getItemCount(): Int {
        return linkedList.size

    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        var numero: TextView?=null
        var date: TextView?=null
        var plom: TextView?=null
        var type: TextView?=null
        var btn_delete: Button?=null
        var btn_update: Button?=null
        init {
            numero = itemView.findViewById(R.id.numero)
            date = itemView.findViewById(R.id.date)
            plom = itemView.findViewById(R.id.plom)
            type = itemView.findViewById(R.id.type)
            btn_delete = itemView.findViewById(R.id.btn_supprimer)
            btn_update = itemView.findViewById(R.id.btn_modifier)
        }
    }

}

这是 ListInter

class ListInter

    {
        var list= LinkedList<InterItem>()
       get() = field
        set(value){field = value}
    }

最佳答案

RecyclerView 无法自行处理数组更改事件。因此,您应该在将元素添加到数组后通过调用以下命令来通知它:

recyclerView.getAdapter().notifyItemInserted(items.size() - 1)

关于android - Kotlin RecyclerView 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50315050/

相关文章:

javascript - Android 上的 Chrome 61+ 中的导航被阻止错误

java - 如何避免RadioGroup在RecyclerView中检查两次

android - 嵌套的 recyclerview 在前几次滚动然后平滑滚动时滞后?

android - 如何在 recyclerview 项目之间设置相等的边距

android - Viewpager2 适配器显示第一页空白

android - 从 URl Android 加载图像时出现内存泄漏

android - 有什么办法可以在 android 和 i-os 的钛合金应用程序中使用 sqlite 数据库吗?

kotlin - 如何将参数声明为没有返回值的函数?

kotlin - Android Kotlin Coroutines : what is the difference between flow, callbackFlow, channelFlow,... 其他流构造函数

java - 如何在 android Color 或 android Paint 中使用 getHSBColor()?