【问题标题】:Listview with edittext - Values changing when scrolling - Android带有edittext的Listview - 滚动时值发生变化 - Android
【发布时间】:2014-04-03 13:38:16
【问题描述】:

我有带有编辑文本的列表视图。

我使用 textchange 监听器来监听 edittext。它工作得很好。

但是当 listview 滚动时, textchange 监听器已经调用并且值正在改变。

如何解决?

我的示例活动如下。

package com.example.test;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;

public class MainActivity extends Activity {

    private ListView listview;
    private EditorAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listview=(ListView)findViewById(R.id.lst);

        ArrayList<String> data = new ArrayList<String>();
        for(int i=0;i<10;i++)
            data.add("i="+i);

        adapter = new EditorAdapter(this,data);
        listview.setAdapter(adapter);

    }

}
class EditorAdapter extends BaseAdapter {

    Context context;
    ArrayList<String> data;

    public EditorAdapter(Context context, ArrayList<String> data){

        this.context = context;
        this.data = data;
    }

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

    @Override
    public Object getItem(int pos) {
        return data.get(pos);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView==null){
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.row_edit_string,null,false);
            holder.editPropertyValue = (EditText) convertView.findViewById(R.id.editPropertyValue);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        holder.editPropertyValue.setTag(position);
        holder.editPropertyValue.setText(data.get(position));
        setNameTextChangeListener(holder, position);
        convertView.setTag(holder);
        return convertView;
    }

    class ViewHolder {
        EditText editPropertyValue;
    }

    private void setNameTextChangeListener(final ViewHolder holder, final int position) {
        holder.editPropertyValue.addTextChangedListener(new TextWatcher() {

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

                if(s.length() > 0)
                {
                    System.out.println("s.toString()  "+s.toString());
                    data.set(position, s.toString());
                    Log.d("rvg", position+": "+data.toString());
                }

            }

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

            @Override
            public void afterTextChanged(Editable s) { }
        });
    }

}

【问题讨论】:

标签: android android-listview


【解决方案1】:

您在每个getView() 上添加TextWatcher。您应该添加一次TextWatcher。在if(convertView==null) 中移动setNameTextChangeListener(holder, position); 方法。

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView==null){
        holder = new ViewHolder();
        convertView = youtInflater.from(context).inflate(R.layout.row_edit_string,null,false);
        holder.editPropertyValue = (EditText) onvertView.findViewById(R.id.editPropertyValue);
       setNameTextChangeListener(holder, position);     
convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.editPropertyValue.setTag(position);
    holder.editPropertyValue.setText(data.get(position));
    convertView.setTag(holder);
    return convertView;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多