android中l(wèi)istview和recyclerview是一個非常常用的控件,但是它有很多問題,現(xiàn)在大多都采用viewholder模式和item復(fù)用南誊。大大提高了它的利用效率,如何條目簡單的話就沒什么問題,但是如何條目復(fù)雜就會出現(xiàn)各種問題冒嫡,最常見的就是復(fù)用問題。
復(fù)用的原理圖:
很簡單明了四苇,這就是listview和recyclerview的復(fù)用孝凌,它不會去創(chuàng)建,而是復(fù)用之前移除屏幕的item
那么當(dāng)之前的item有了點擊事件或者其他選中之類的操作月腋,那之后的item也會有蟀架,所以就出現(xiàn)了復(fù)用的問題。現(xiàn)在網(wǎng)上有各種各樣的辦法榆骚,我提供的這個比較簡單片拍,沒有什么難度。
解決思路:在獲取item中判斷我們的控件是否已經(jīng)處理過妓肢。
我們具體來舉個實例:現(xiàn)在有一個recyclerview的item布局 我們需要在這個item中處理一個類似點贊的效果捌省,如果我們不處理復(fù)用,那當(dāng)我們點擊一個之后碉钠,那之后復(fù)用該item的肯定也是點擊之后的效果纲缓。所以我們需要處理,具體方法如下:
在adapter中的onbindviewholder方法中就是設(shè)置每一個item的喊废,listview是在getview中
1.我么需要先再我們adapter類中加一個保存我們處理該控件的arrylist
2.然后再在我們的onBindViewHolder方法中為我們的每一個點贊的Imageview設(shè)置一個tag
3.當(dāng)我們設(shè)置該Imageview的點擊事件時祝高,我們要將點擊的ImageView的tag取出來放在我們之前的arraylist中保存
4.當(dāng)然我們還要記得再次點擊的時候移除該ImageVIew的tag
5最近可以在我們的onBindViewHold方法中判斷我們是否處理了該控件,是否處理過其實就是該position是否包含在arraylist中污筷,arraylist中存的是Imageview的tag褂策,Imageview的tag就是position
這里只是簡單的寫了一下Imageview的點擊事件,其它控件也可以這樣處理。