Kotlin RecycleView无法正常工作

时间:2018-05-13 10:18:47

标签: android android-recyclerview kotlin

我想创建一个小应用程序,一旦用户点击浮动按钮操作来添加元素。它会自动添加  到循环视图的顶部。

我为此创建了一个主要活动,其中包含回收者的片段和添加flotten。

用户单击此按钮后,将显示一个碎片对话框以插入该元素。一旦用户确认我想将新元素添加到回收视图的顶部。

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

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

我使用了模型视图演示器,这里是我的差异类

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.ADD Presenter

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}
    }

1 个答案:

答案 0 :(得分:2)

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

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