ListView中EditText的数据加载错乱的问题

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

                    }

                });

            }

        }

    }

} 

 

你可能感兴趣的:(ListView)