• 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());
                        }
                    });
                }
            }
        }
    } 
  • 相关阅读:
    angularJS(5)
    angularJS(4)
    angularJS(3)
    AngularJS(1)
    angularJS(2)
    关于响应式布局
    PHP+JQUEY+AJAX实现分页【转】
    bootscript/javascript组件
    你必须收藏的Github技巧
    关于php的一些小知识!
  • 原文地址:https://www.cnblogs.com/xuewater/p/3250063.html
Copyright © 2020-2023  润新知