【移動應(yīng)用開發(fā)技術(shù)】解決ListView中包含EditText數(shù)據(jù)混亂原理_第1頁
【移動應(yīng)用開發(fā)技術(shù)】解決ListView中包含EditText數(shù)據(jù)混亂原理_第2頁
【移動應(yīng)用開發(fā)技術(shù)】解決ListView中包含EditText數(shù)據(jù)混亂原理_第3頁
【移動應(yīng)用開發(fā)技術(shù)】解決ListView中包含EditText數(shù)據(jù)混亂原理_第4頁
【移動應(yīng)用開發(fā)技術(shù)】解決ListView中包含EditText數(shù)據(jù)混亂原理_第5頁
免費預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】解決ListView中包含EditText數(shù)據(jù)混亂原理

要求:屏幕中顯示一個listview,其中每一個item都有一個editText,在任一editText上輸入內(nèi)容,快速上下滑動,保證數(shù)據(jù)不混亂。這是一道面試題,初看沒什么,應(yīng)該會很簡單,但實際解決起來沒那么簡單,先上解決代碼。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,下標(biāo)依次為:0、1、2、3、4、5、6.其中下標(biāo)為0的item的地址值是3098e6e5通過向上滑動,當(dāng)出現(xiàn)第8行item(下標(biāo)為7)的時候,下標(biāo)為0的item已經(jīng)完全看不到了,根據(jù)谷歌設(shè)計原理,下標(biāo)為0的item復(fù)用到了剛剛出現(xiàn)的下標(biāo)為7的item上,其中可以看到下標(biāo)為7的item的地址值也是3098e6e5,以上可以證明。這些都是大家知道的,重點看下面:為什么要寫viewHolder.text.setTag(position);這一行意義重大,在滑動的過程中,動態(tài)的將item與position進(jìn)行綁定,如圖:那么這么做的意義是什么呢,可以看到item中的editText有一個監(jiān)聽事件:每當(dāng)editText內(nèi)容變化的時候都會將editText上的內(nèi)容保存至集合中,那么保存到集合的哪一個下標(biāo)中呢?看這行int

pos

=

(int)

viewHolder.text.getTag();被點擊的那行item根據(jù)getTag()獲取了最近與它綁定的那個position,還以地址為3098e6e5的item為例,那么pos的值此時應(yīng)該是0還是7呢?這與當(dāng)前l(fā)istview滑動的位置有關(guān),如果當(dāng)前屏幕能看到下標(biāo)為7的item,那么此時pos就必定為7,不可能為0,第一:item只能動態(tài)與一個position相綁定,第二,綁定是動態(tài)變化的,當(dāng)前屏幕能看到的是下標(biāo)為7的item,自然item與下標(biāo)7綁定就不能再與下標(biāo)0綁定了。那么就得到pos為7,集合就會將當(dāng)前editText的內(nèi)容保存到下標(biāo)為7的對象中。那么無論再怎么上下滑動,只有當(dāng)positon為7的時候才能從集合中獲取那條保存的數(shù)據(jù),其他position都不可以,其他item也同理。如果正常寫會出現(xiàn)什么呢?例如:監(jiān)聽器里不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到最后再滑動到開頭(我設(shè)置了長度為51),讓每一個item充分復(fù)用,此時再次在下標(biāo)為0的item中輸入內(nèi)容,打印數(shù)據(jù)如下:可以看到,我只在一個item的editText中輸入了1個字,按道理來說應(yīng)該只觸發(fā)下標(biāo)為0的那個item,并將下標(biāo)為0的item上的數(shù)據(jù)保存到集合,但事實上卻觸發(fā)了這么多item中的editText的監(jiān)聽,這是為什么呢?原因是在上下快速滑動的過程中,下標(biāo)為0的item出現(xiàn)了大量的復(fù)用情況,例如第0、

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論