首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EditText in ListView在滚动中丢失内容

EditText in ListView在滚动中丢失内容
EN

Stack Overflow用户
提问于 2015-06-11 07:14:38
回答 5查看 1.8K关注 0票数 1

我一直在寻找解决问题的方法,找到答案,但没有一个对我有用。/我在每个列表项中都有一个带有编辑文本的列表视图,当滚动并再次向上滚动时,编辑的编辑文本的内容已经丢失,或者其他编辑文本已经占用了他的价值。

http://i.stack.imgur.com/zWu0H.png

我有一个全局textWatcher,并动态地添加和删除它。编辑内容不断丢失。

代码语言:javascript
运行
复制
 public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    ArrayPosition = position;

    if(convertView == null)
    {
        LayoutInflater inflater = (LayoutInflater) AdapterContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.item_list_order, parent, false);

        holder = new ViewHolder();
        holder.FlightTimeTextView = (TextView) convertView.findViewById(R.id.itemFlightTimeTextView);
        holder.BusNumberEditText = (EditText) convertView.findViewById(R.id.busNumberEditText);

        convertView.setTag(holder);
    } else {

        holder = (ViewHolder) convertView.getTag();
    }

    final Order order = Orders.get(position);
    holder.FlightTimeTextView.setText(order.getFlightTime());

    holder.BusNumberEditText.removeTextChangedListener(textWatcher);

    Log.d("String in array String", HolderBusNumbers[position]);
    holder.BusNumberEditText.setText(HolderBusNumbers[position]);

    holder.BusNumberEditText.addTextChangedListener(textWatcher);

    return convertView;
}

int ArrayPosition = 0;
TextWatcher textWatcher = 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) {
        Log.d("TextWatcher", s.toString());
        HolderBusNumbers[ArrayPosition] = s.toString();
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

我工作了一个小时,你能帮我解决一下我做错了什么吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-06-11 11:22:22

在静态ViewHolder中创建一个引用整数,该整数保存列表视图中单击项的位置。然后,在文本观察器中,我设置了存在于列表的viewholder.reference位置中的项的字符串。所以,静电对这份工作有帮助。下面的代码起作用了!

代码语言:javascript
运行
复制
static class ViewHolder{

    TextView FlightTimeTextView;
    EditText BusNumberEditText;
    int Reference;
}

public View getView(final int position, View convertView, ViewGroup parent) {

    final ViewHolder holder;
    if(convertView == null)
    {
        LayoutInflater inflater = (LayoutInflater) AdapterContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.item_list_order, parent, false);

        holder = new ViewHolder();
        holder.FlightTimeTextView = (TextView) convertView.findViewById(R.id.itemFlightTimeTextView);
        holder.BusNumberEditText = (EditText) convertView.findViewById(R.id.busNumberEditText);

        convertView.setTag(holder);
    } else {

        holder = (ViewHolder) convertView.getTag();
    }

    final Order order = Orders.get(position);

    holder.Reference = position;
    holder.FlightTimeTextView.setText(order.getFlightTime());
    holder.BusNumberEditText.setText(order.getBusNumber());
    holder.BusNumberEditText.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) {
            Orders.get(holder.Reference).setBusNumber(s.toString());
        }
    });

    return convertView;
}

}

票数 -1
EN

Stack Overflow用户

发布于 2015-06-11 07:44:07

将文本处理程序代码移动到getView()中

代码语言:javascript
运行
复制
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    ArrayPosition = position;

    if(convertView == null)
    {
        LayoutInflater inflater = (LayoutInflater) AdapterContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.item_list_order, parent, false);

        holder = new ViewHolder();
        holder.FlightTimeTextView = (TextView) convertView.findViewById(R.id.itemFlightTimeTextView);
        holder.BusNumberEditText = (EditText) convertView.findViewById(R.id.busNumberEditText);

        convertView.setTag(holder);
    } else {

        holder = (ViewHolder) convertView.getTag();
    }

    final Order order = Orders.get(position);
    holder.FlightTimeTextView.setText(order.getFlightTime());

    holder.BusNumberEditText.removeTextChangedListener(textWatcher);

    Log.d("String in array String", HolderBusNumbers[position]);
    holder.BusNumberEditText.setText(HolderBusNumbers[position]);

   holder.BusNumberEditText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start,
                    int before, int count) {
                Log.d("TextWatcher", s.toString());
        HolderBusNumbers[ArrayPosition] = s.toString();
            }

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

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

    return convertView;
}
票数 0
EN

Stack Overflow用户

发布于 2015-06-11 07:58:24

您必须使用HashMap对象来存储数据,如果edittext包含值,或者当您滚动listview时,它将通过调用其getView方法以及与每个编辑文本相关联的文本再次呈现。

  1. 将HashMap全局定义为适配器 公共静态HashMap myList=new HashMap();公共视图getView(int位置,视图convertView,ViewGroup父级){ ViewHolder持位;ArrayPosition =位置;if(convertView == null) { LayoutInflater空值= (LayoutInflater) String> convertView =inflater.inflate(LayoutInflater,双亲,false);holder =新的String>();( convertView.findViewById(R.id.itemFlightTimeTextView);= (TextView) TextView holder.BusNumberEditText = (EditText) convertView.findViewById(R.id.busNumberEditText);convertView.setTag( holder );} holder.FlightTimeTextView {holder= (ViewHolder) convertView.getTag();} final order = Orders.get(position);holder.FlightTimeTextView.setText(order.getFlightTime());Log.d("String in array String",HolderBusNumbersposition);holder.BusNumberEditText.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s,int start,int onTextChanged,int count) {} public void beforeTextChanged(CharSequence s,int start,int count,int after) { // TODO自动生成的方法存根} public void afterTextChanged(可编辑的s) { myList.put(pos,s.toString.trim();});holder.BusNumberEditText.setText(myList.get(position));返回convertView;}

这会对你有帮助的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30774050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档