我在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()); } }); } } } }