




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發技術】解決ListView中包含EditText數據混亂原理
要求:屏幕中顯示一個listview,其中每一個item都有一個editText,在任一editText上輸入內容,快速上下滑動,保證數據不混亂。這是一道面試題,初看沒什么,應該會很簡單,但實際解決起來沒那么簡單,先上解決代碼。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);
}
}
}解釋:通過打印log可以看到,屏幕中最多可以顯示7行item,下標依次為:0、1、2、3、4、5、6.其中下標為0的item的地址值是3098e6e5通過向上滑動,當出現第8行item(下標為7)的時候,下標為0的item已經完全看不到了,根據谷歌設計原理,下標為0的item復用到了剛剛出現的下標為7的item上,其中可以看到下標為7的item的地址值也是3098e6e5,以上可以證明。這些都是大家知道的,重點看下面:為什么要寫viewHolder.text.setTag(position);這一行意義重大,在滑動的過程中,動態的將item與position進行綁定,如圖:那么這么做的意義是什么呢,可以看到item中的editText有一個監聽事件:每當editText內容變化的時候都會將editText上的內容保存至集合中,那么保存到集合的哪一個下標中呢?看這行int
pos
=
(int)
viewHolder.text.getTag();被點擊的那行item根據getTag()獲取了最近與它綁定的那個position,還以地址為3098e6e5的item為例,那么pos的值此時應該是0還是7呢?這與當前listview滑動的位置有關,如果當前屏幕能看到下標為7的item,那么此時pos就必定為7,不可能為0,第一:item只能動態與一個position相綁定,第二,綁定是動態變化的,當前屏幕能看到的是下標為7的item,自然item與下標7綁定就不能再與下標0綁定了。那么就得到pos為7,集合就會將當前editText的內容保存到下標為7的對象中。那么無論再怎么上下滑動,只有當positon為7的時候才能從集合中獲取那條保存的數據,其他position都不可以,其他item也同理。如果正常寫會出現什么呢?例如:監聽器里不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)
{
}
});運行app后,首先上下滑動listView到最后再滑動到開頭(我設置了長度為51),讓每一個item充分復用,此時再次在下標為0的item中輸入內容,打印數據如下:可以看到,我只在一個item的editText中輸入了1個字,按道理來說應該只觸發下標為0的那個item,并將下標為0的item上的數據保存到集合,但事實上卻觸發了這么多item中的editText的監聽,這是為什么呢?原因是在上下快速滑動的過程中,下標為0的item出現了大量的復用情況,例如第0、
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉儲職業安全管理制度
- 中小建筑公司管理制度
- 麗水防偽技術管理制度
- 傳媒機構宿舍管理制度
- 優化采購預算管理制度
- 倉儲貨物入庫管理制度
- 上市公司股權管理制度
- 會計關于印章管理制度
- 企業酒類安全管理制度
- 產業扶貧基地管理制度
- 安全環保履職述職報告
- 電大財務大數據分析編程作業4
- 2023年零售藥店醫療器械質量管理制度職責操作規程體系文件
- 4M變更管理培訓
- 新中國史智慧樹知到期末考試答案2024年
- MOOC 電磁場與波-華中科技大學 中國大學慕課答案
- MOOC 創新管理-浙江大學 中國大學慕課答案
- 梨的貯藏特性及保鮮技術
- 2024年人參相關項目實施方案
- 2024年安徽淮河能源控股集團有限責任公司招聘筆試參考題庫含答案解析
- 混合痔術后護理查房
評論
0/150
提交評論