安卓ListView的Item中含有EditText,EditText里面的值保存,并且滑动ListView时EditText值不改变

前一段时间项目中用ListView ,ListView的item是EditText,然后设置EditText的值,滑动ListVIew,EditText中的值就改变了,当时在网上查了查各种各样的说法,最后找方法先把问题给解决了,今天闲来没事就写篇博客,说说怎么做的:

首先,主布局文件就一个ListView

   <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="@android:color/transparent"
        android:divider="@android:color/transparent"
        android:listSelector="@android:color/transparent" 
        android:scrollbars="none">
接着,在MainActivity中设置adapter

     @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView = (ListView) findViewById(R.id.listView);
		MyAdapter myAdapter = new MyAdapter(this);
		listView.setAdapter(myAdapter);
	}
最后看看 adapter
view里边就一个TextView,EditText
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" 
    android:padding="30dp">

    <TextView
        android:id="@+id/tv_position"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:gravity="center_vertical"
        android:text="第0个" 
        android:padding="6dp"/>

    <EditText
        android:id="@+id/et_number"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:gravity="center_vertical" />

</LinearLayout>
最后看MyAdapter

public class MyAdapter extends BaseAdapter {
    private Context context;
    HashMap<Integer, String> saveMap;//这个集合用来存储对应位置上Editext中的文本内容
    public MyAdapter(Context context) {
        super();
        this.context = context;
        saveMap = new HashMap<Integer, String>();
    }
    @Override
    public int getCount() {
        return 30;
    }
    @Override
    public Object getItem(int position) {
        return null;
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder vh = null;
        if (convertView == null) {
            vh = new ViewHolder();
            convertView = View.inflate(context, R.layout.item_editext, null);
            vh.et_number = (EditText) convertView.findViewById(R.id.et_number);
            vh.tv_position = (TextView) convertView
                    .findViewById(R.id.tv_position);
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }
        vh.tv_position.setText("第" + position + "个:");
        
        vh.et_number.setTag(position);//设置editext一个标记  
        vh.et_number.clearFocus();//清除焦点  不清除的话因为item复用的原因   多个Editext同时改变
        vh.et_number.setText(saveMap.get(position));//将对应保存在集合中的文本内容取出来  并显示上去
        
        final EditText tempEditText=vh.et_number;
        vh.et_number.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }
            @Override 
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }
            @Override
            public void afterTextChanged(Editable s) {
                Integer tag= (Integer) tempEditText.getTag();
                saveMap.put(tag, s.toString());//在这里根据position去保存文本内容
            }
        });
        Log.e("TAG", saveMap.toString());
        return convertView;
    }
    public class ViewHolder {
        EditText et_number;
        TextView tv_position;
    }
}
最后测试下:

分别在第一个,第三个,最后一个中分别写入01,03,029

来回滑动下发现屏幕上显示没问题,看Log


值也保存上了 ,

点击这里下载源码

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值