EditText 使用 TextWatcher 更新 ListView 上的项目

EditText updates items on ListView with TextWatcher

在主要 class 中,我有一个 ListView 和一个 EditText。 ListView 使用自定义 BaseAdapter 并包含每行显示的多个项目。 我想像 TextWatcher 一样使用,它允许我在 EditText 中输入一些数字,并且该输入将显示在 ListView 的一项中。

为了更好地解释我的问题,请查看下面我的部分代码。

主要Class:

...
etAmount = (EditText) findViewById(R.id.edt_text);
lvDisplay = (ListView) findViewById(R.id.listView_display);
...
CustomAdapter adapter = new CustomAdapter(this, menuList, new CustomAdapter.onDoneClick() {
    @Override
    public void onClick(View v, int position) {}
    });
lvDisplay.setAdapter(adapter);
...

自定义适配器 Class:

...
public CustomAdapter(Context context, List<MenuModel> objects, onDoneClick listener) {
    this.context = context;
    this.menuList = objects;
    this.mListener = listener;
}

public interface onDoneClick{
    void onClick(View v, int position);
}

@Override
public int getCount() {
    return menuList.size();
}

@Override
public Object getItem(int position) {
    return menuList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    View view = convertView;
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (view  == null) {
        holder = new ViewHolder();
        view = inflater.inflate(R.layout.item_layout, parent, false);
        holder.tvFirst = (TextView) view.findViewById(R.id.item1);
        holder.tvSecond = (TextView) view.findViewById(R.id.item2);
        holder.tvThird = (TextView) view.findViewById(R.id.item3);
    } else {
        holder = (ViewHolder) view.getTag();
    }

    final MenuModel item = menuList.get(position);

    if (item != null) {
        holder.tvFirst.setText(item.getName());
        holder.tvSecond.setText(item.getRate());
    }

    return view;
}

static class ViewHolder {
    TextView tvFirst;
    TextView tvSecond;
    TextView tvThird;
}

我的目的是在EditText上输入一些数字(例如100),这个数字将乘以tvSecond的值,然后在tvThird中显示最终值。

非常感谢您的帮助。

希望我理解正确,但是你可以在CustomAdapter中添加一个实例变量tvThirdText。现在,将文本观察器添加到 EditText etAmount 并在 afterTextChanged(Editable text) 方法中将 tvThirdText 设置为您想要的,然后在适配器上调用 notifyDataSetChanged()。您必须进行的最后更改是在 getView() 方法中,您必须将 holder.tvThird 设置为正确的值。这是可以帮助您的完整代码。

主要Class:

        etAmount.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            adapter.tvThirdText = Integer.parseInt(s.toString().trim());
            adapter.notifyDataSetChanged();
        }
    });

适配器Class:

public int tvThirdText; //can make this private and add setter method if needed
...

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
...
    if (item != null) {
        holder.tvFirst.setText(item.getName());
        holder.tvSecond.setText(item.getRate());
        holder.tvThird.setText(tvThirdText * item.getRate());
    }