天天看点

在ListView中修改EditText的值

由于ViewHolder的复用机制,所有当ListView修改EditText的时候,会出现修改完后的值变唯有设定的值,解决问题的思路: 1.为我们的EditText设定一个标记。

holder.ActualNum.setTag(position); // 为输入框设定标签,防止修改时错乱
           

2.为EditText设定一个Touch事件监听,获取到对应的position

holder.ActualNum.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
     // TODO Auto-generated method stub
     if (event.getAction() == MotionEvent.ACTION_UP) {
      index = (Integer) v.getTag();
      Log.i("0302", "onTouch"+index);
     }
     return false;
    }
   });
           

3.对EditText的输入转态进行监听,编写一个类实现 TextWatcher 接口

class MyTextWatcher implements TextWatcher {

    private ViewHolder mHolder;

    public MyTextWatcher(ViewHolder holder) {
     Log.i("0302", "构造函数TextWatcher");
     mHolder = holder;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start,
      int count, int after) {
     // TODO Auto-generated method stub

    }

    @Override
    public void onTextChanged(CharSequence s, int start,
      int before, int count) {
     // TODO Auto-generated method stub

    }

    @Override
    public void afterTextChanged(Editable s) {
     // TODO Auto-generated method stub
     if (s != null && !"".equals(s)) {
      int position = (Integer) mHolder.ActualNum.getTag();
      Log.i("0302", "EditText的标记:" + position);
      mMaterialList.get(position).setActualNum(s.toString());
    //获得以及标记的EditText的下标,并且改变其数据源的值
     }
    }
   }
           

4.最后就是实现EditText的监听

holder.ActualNum.addTextChangedListener(new MyTextWatcher(holder));
           

以上几个步骤可以实现ListView中修改EditText的值,Adapter的源码如下:

package com.infok.adapter;

import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.vsee.R;
import com.infok.custom_view.RoundButton;
import com.infok.model.MaterialEntity;

/**
 * @Title: ReceiveMaterialAdapter.java
 * @author FANG
 * @Description: 收货适配器
 * @date 2015-2-28 下午2:03:36
 */
public class ReceiveMaterialAdapter extends BaseAdapter {
 private LayoutInflater inflater;
 private ViewHolder holder;
 private List<MaterialEntity> mMaterialList;

 public ReceiveMaterialAdapter(Context context,
   List<MaterialEntity> mMaterialList) {
  this.mMaterialList = mMaterialList;
  inflater = LayoutInflater.from(context);
 }

 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return mMaterialList.size();
 }

 @Override
 public Object getItem(int position) {
  // TODO Auto-generated method stub
  return mMaterialList.get(position);
 }

 @Override
 public long getItemId(int position) {
  // TODO Auto-generated method stub
  return position;
 }

 private Integer index = -1;

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  if (convertView == null) {
   holder = new ViewHolder();
   convertView = inflater.inflate(R.layout.listitem_receive_material,
     null);
   holder.mRoundButton = (RoundButton) convertView
     .findViewById(R.id.roundButton);
   holder.mMaterialNo = (TextView) convertView
     .findViewById(R.id.listitem_material_no);
   holder.purchaseNum = (TextView) convertView
     .findViewById(R.id.listitem_purchase_num);
   holder.ActualNum = (EditText) convertView
     .findViewById(R.id.listitem_actual_num);
   holder.ActualNum.setTag(position); // 为输入框设定标签,防止修改时错乱
   holder.ActualNum.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
     // TODO Auto-generated method stub
     if (event.getAction() == MotionEvent.ACTION_UP) {
      index = (Integer) v.getTag();
      Log.i("0302", "onTouch"+index);
     }
     return false;
    }
   });

   class MyTextWatcher implements TextWatcher {

    private ViewHolder mHolder;

    public MyTextWatcher(ViewHolder holder) {
     Log.i("0302", "构造函数TextWatcher");
     mHolder = holder;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start,
      int count, int after) {
     // TODO Auto-generated method stub

    }

    @Override
    public void onTextChanged(CharSequence s, int start,
      int before, int count) {
     // TODO Auto-generated method stub

    }

    @Override
    public void afterTextChanged(Editable s) {
     // TODO Auto-generated method stub
     if (s != null && !"".equals(s)) {
      int position = (Integer) mHolder.ActualNum.getTag();
      Log.i("0302", "EditText的标记:" + position);
      mMaterialList.get(position).setActualNum(s.toString());
     }
    }
   }
   holder.ActualNum.addTextChangedListener(new MyTextWatcher(holder));
   holder.mLayout = (LinearLayout) convertView
     .findViewById(R.id.listitem_backround_linearlayout);
   convertView.setTag(holder);

  } else {
   holder = (ViewHolder) convertView.getTag();
   holder.ActualNum.setTag(position);

  }

  if (position % 2 == 0) { // 偶数数的时候设置背景
   holder.mLayout.setBackgroundResource(R.color.listitem2);
  } else { // 奇数的时候设置背景
   holder.mLayout.setBackgroundResource(R.color.listitem1);
       //相邻的两条Item的背景颜色不同
  }

  final MaterialEntity material = mMaterialList.get(position);

  holder.mMaterialNo.setText(material.getMaterialNo());
  holder.purchaseNum.setText(material.getPurchaseNum());
  holder.ActualNum.setText(material.getActualNum());
  holder.mRoundButton.setButtonText(material.getColor());
  holder.mRoundButton.setButtonBackground(Color.RED);

  return convertView;
 }

 private class ViewHolder {
  private RoundButton mRoundButton;
  private TextView mMaterialNo, purchaseNum;
  private EditText ActualNum;
  private LinearLayout mLayout;
 }

}