简体   繁体   中英

EditText in ListView loses content in scroll

I've been digging to find a solution on my problem finding answers but none of them have worked for me. :/ I have a listview with edittext in each list item and when scrolling down and go up again content of the edited edittext has been lost or other edittext has taken his value.

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

I have a global textWatcher and adding and removing it dynamically. Edittexts keep losing the content.

 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) {

    }
};

I am working it for a hours, can you help with what i'm doing wrong :/ ??

Move your textwatcher code inside the getView()

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;
}

You have to use HashMap object which will store data if EditText contains value or not.And when you scroll the listview,it will be rendered again by calling its getView method along with the text associated with each edittext.

  1. Define HashMap global into adapter

     public static HashMap<Integer,String> myList=new HashMap<Integer,String>(); 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()); Log.d("String in array String", HolderBusNumbers[position]); holder.BusNumberEditText.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } public void afterTextChanged(Editable s) { myList.put(pos,s.toString.trim()); } }); holder.BusNumberEditText.setText(myList.get(position)); return convertView; } 

It would be helpful to you!!

我也是android的初学者,但尝试使用SimpleAdapter来显示数据

Created a reference integer in the static ViewHolder that holds the position of clicked item in listview. Then in text watcher i set the string of the item that exists in the viewholder.reference position of my list. So, static is helping with that job. The following code is the one that worked!

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;
}

}

将您的Textwatcher放入适配器的getView()函数中,将position(getview函数的第一个参数)最终转换为int,并在onTextChange中执行此操作

HolderBusNumbers[position] = s.toString();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM