我在ListView中用BaseAdapter的getView()方法加載適配器,每個Item里有一個TextView和一個EditText,當我在第一個EditText里面輸入數據,比如1234時,同時會在第八個EditText中也出現1234,同樣的,如果我在第二個EditText中輸入1234,那么在第九個EditText中就會出現1234,以此類推,不知道是怎么回事,下面有解決方法和原因
ListView 為了避免浪費內存 只是用了 一屏幕的 ListItem
所以每次 getView 的 時候會 使用 使用這一屏幕中的 其中一個 item
所以在adapter 的getView方法中 必須每次重新設置數據
像textView CheckBox 等變化 的 狀態必須用一個數組保存
直接貼代碼:
public class ListTestActivity extends Activity { ListView mListView; Map<Integer, String> mMapContent; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mMapContent = new HashMap<Integer, String>(); mListView = (ListView)findViewById(R.id.listview); mListView.setAdapter(new MyListAdapter(this, 20)); } class MyListAdapter extends BaseAdapter { int mCount; Context mContext; public MyListAdapter(Context context, int count) { mCount = count; mContext = context; } public int getCount() { return mCount; } public Object getItem(int arg0) { return arg0; } public long getItemId(int arg0) { return arg0; } public View getView(int position, View convertView, ViewGroup arg2) { ViewHold holder = null; if(convertView == null) { convertView = LinearLayout.inflate(mContext, R.layout.list_item, null); holder = new ViewHold(convertView); convertView.setTag(holder); } else { holder = (ViewHold)convertView.getTag(); } holder.position = position; holder.textView.setText("listitem" + position + ":"); holder.editText.setText(mMapContent.get(position));//Integer.valueOf(position) return convertView; } class ViewHold { TextView textView; EditText editText; int position; public ViewHold(View v) { textView = (TextView)v.findViewById(R.id.textview); editText = (EditText)v.findViewById(R.id.edittext); editText.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { mMapContent.put(position, s.toString()); } }); } } } }
