下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】解決ListView中包含EditText數(shù)據(jù)混亂原理
要求:屏幕中顯示一個(gè)listview,其中每一個(gè)item都有一個(gè)editText,在任一editText上輸入內(nèi)容,快速上下滑動(dòng),保證數(shù)據(jù)不混亂。這是一道面試題,初看沒(méi)什么,應(yīng)該會(huì)很簡(jiǎn)單,但實(shí)際解決起來(lái)沒(méi)那么簡(jiǎn)單,先上解決代碼。package
com.zhiren.mytestok;
import
android.content.Context;
import
android.text.Editable;
import
android.text.TextUtils;
import
android.text.TextWatcher;
import
android.util.Log;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.BaseAdapter;
import
android.widget.EditText;
import
java.util.List;
/**
*
Created
by
Administrator
on
2017/2/20.
*/
public
class
MyAdapters
extends
BaseAdapter
{
private
Context
context;
//
private
String[]
str;
private
List
list;
public
MyAdapters(Context
context,
List
list)
{
this.context
=
context;
this.list
=
list;
}
@Override
public
int
getCount()
{
return
list.size();
}
@Override
public
Object
getItem(int
position)
{
return
null;
}
@Override
public
long
getItemId(int
position)
{
return
position;
}
@Override
public
View
getView(final
int
position,
View
convertView,
ViewGroup
parent)
{
final
ViewHolder
viewHolder;
if
(convertView
==
null)
{
convertView
=
View.inflate(context,
R.layout.item_mian,
null);
viewHolder
=
new
ViewHolder(convertView);
convertView.setTag(viewHolder);
}
else
{
viewHolder
=
(ViewHolder)
convertView.getTag();
}
Bean
bean
=
(Bean)
list.get(position);
Log.e("TAG",
viewHolder.text
+
":"
+
position);
viewHolder.text.setTag(position);
viewHolder.text.clearFocus();
viewHolder.text.addTextChangedListener(new
TextWatcher()
{
@Override
public
void
beforeTextChanged(CharSequence
s,
int
start,
int
count,
int
after)
{
}
@Override
public
void
onTextChanged(CharSequence
s,
int
start,
int
before,
int
count)
{
int
pos
=
(int)
viewHolder.text.getTag();
Bean
b
=
(Bean)
list.get(pos);
b.setName(s
+
"");
}
@Override
public
void
afterTextChanged(Editable
s)
{
}
});
if
(!TextUtils.isEmpty(bean.getName()))
{
viewHolder.text.setText(bean.getName());
}
else
{
viewHolder.text.setText("");
}
return
convertView;
}
public
class
ViewHolder
{
private
EditText
text;
public
ViewHolder(View
v)
{
text
=
(EditText)
v.findViewById(R.id.et_item);
}
}
}解釋:通過(guò)打印log可以看到,屏幕中最多可以顯示7行item,下標(biāo)依次為:0、1、2、3、4、5、6.其中下標(biāo)為0的item的地址值是3098e6e5通過(guò)向上滑動(dòng),當(dāng)出現(xiàn)第8行item(下標(biāo)為7)的時(shí)候,下標(biāo)為0的item已經(jīng)完全看不到了,根據(jù)谷歌設(shè)計(jì)原理,下標(biāo)為0的item復(fù)用到了剛剛出現(xiàn)的下標(biāo)為7的item上,其中可以看到下標(biāo)為7的item的地址值也是3098e6e5,以上可以證明。這些都是大家知道的,重點(diǎn)看下面:為什么要寫(xiě)viewHolder.text.setTag(position);這一行意義重大,在滑動(dòng)的過(guò)程中,動(dòng)態(tài)的將item與position進(jìn)行綁定,如圖:那么這么做的意義是什么呢,可以看到item中的editText有一個(gè)監(jiān)聽(tīng)事件:每當(dāng)editText內(nèi)容變化的時(shí)候都會(huì)將editText上的內(nèi)容保存至集合中,那么保存到集合的哪一個(gè)下標(biāo)中呢?看這行int
pos
=
(int)
viewHolder.text.getTag();被點(diǎn)擊的那行item根據(jù)getTag()獲取了最近與它綁定的那個(gè)position,還以地址為3098e6e5的item為例,那么pos的值此時(shí)應(yīng)該是0還是7呢?這與當(dāng)前l(fā)istview滑動(dòng)的位置有關(guān),如果當(dāng)前屏幕能看到下標(biāo)為7的item,那么此時(shí)pos就必定為7,不可能為0,第一:item只能動(dòng)態(tài)與一個(gè)position相綁定,第二,綁定是動(dòng)態(tài)變化的,當(dāng)前屏幕能看到的是下標(biāo)為7的item,自然item與下標(biāo)7綁定就不能再與下標(biāo)0綁定了。那么就得到pos為7,集合就會(huì)將當(dāng)前editText的內(nèi)容保存到下標(biāo)為7的對(duì)象中。那么無(wú)論再怎么上下滑動(dòng),只有當(dāng)positon為7的時(shí)候才能從集合中獲取那條保存的數(shù)據(jù),其他position都不可以,其他item也同理。如果正常寫(xiě)會(huì)出現(xiàn)什么呢?例如:監(jiān)聽(tīng)器里不getTag()viewHolder.text.addTextChangedListener(new
TextWatcher()
{
@Override
public
void
beforeTextChanged(CharSequence
s,
int
start,
int
count,
int
after)
{
}
@Override
public
void
onTextChanged(CharSequence
s,
int
start,
int
before,
int
count)
{
//
int
pos
=
(int)
viewHolder.text.getTag();
//
Bean
b
=
(Bean)
list.get(pos);
//
b.setName(s
+
"");
Bean
b
=
(Bean)
list.get(position);
b.setName(s
+
"");
Log.e("TAG",
""
+
position);
}
@Override
public
void
afterTextChanged(Editable
s)
{
}
});運(yùn)行app后,首先上下滑動(dòng)listView到最后再滑動(dòng)到開(kāi)頭(我設(shè)置了長(zhǎng)度為51),讓每一個(gè)item充分復(fù)用,此時(shí)再次在下標(biāo)為0的item中輸入內(nèi)容,打印數(shù)據(jù)如下:可以看到,我只在一個(gè)item的editText中輸入了1個(gè)字,按道理來(lái)說(shuō)應(yīng)該只觸發(fā)下標(biāo)為0的那個(gè)item,并將下標(biāo)為0的item上的數(shù)據(jù)保存到集合,但事實(shí)上卻觸發(fā)了這么多item中的editText的監(jiān)聽(tīng),這是為什么呢?原因是在上下快速滑動(dòng)的過(guò)程中,下標(biāo)為0的item出現(xiàn)了大量的復(fù)用情況,例如第0、
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 揚(yáng)塵治理委托協(xié)議模板
- 2025年度文化創(chuàng)意產(chǎn)品開(kāi)發(fā)合作協(xié)議范本3篇
- 2025版外債借款合同法律框架與政策背景分析3篇
- 2025年銷售薪資與銷售團(tuán)隊(duì)建設(shè)合同2篇
- 2025版押一付三車位租賃合同模板參考9篇
- 2025年高端住宅產(chǎn)權(quán)轉(zhuǎn)讓合同范本3篇
- 2025-2030全球熔鹽儲(chǔ)熱設(shè)備行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)實(shí)驗(yàn)室渦旋混合器行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025版投票權(quán)委托合同:股東權(quán)益保護(hù)專項(xiàng)3篇
- 2025年度綠色有機(jī)農(nóng)產(chǎn)品個(gè)人果園承包經(jīng)營(yíng)合同書(shū)4篇
- 2025年N1叉車司機(jī)考試試題(附答案)
- 《醫(yī)院財(cái)務(wù)分析報(bào)告》課件
- 2025老年公寓合同管理制度
- 2024年考研政治試題及答案
- 2024-2025學(xué)年人教版數(shù)學(xué)六年級(jí)上冊(cè) 期末綜合卷(含答案)
- 2024中國(guó)汽車后市場(chǎng)年度發(fā)展報(bào)告
- 感染性腹瀉的護(hù)理查房
- 天津市部分區(qū)2023-2024學(xué)年高二上學(xué)期期末考試 物理 含解析
- 2025年初級(jí)社會(huì)工作者綜合能力全國(guó)考試題庫(kù)(含答案)
- 《人工智能基礎(chǔ)》全套英語(yǔ)教學(xué)課件(共7章)
- GB/T 35613-2024綠色產(chǎn)品評(píng)價(jià)紙和紙制品
評(píng)論
0/150
提交評(píng)論