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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM