Ошибки с пользовательским BaseAdapter для AutoCompleteTextView (indexOutOfBounds и содержимое изменены, но нет уведомления)

Я создал свой собственный адаптер, который расширяет BaseAdapter и реализует Filterable.

Иногда я получаю ошибку индекса за пределами границ в методе getView:

    private ArrayList<ResultHolderData> originalData;
private ArrayList<ResultHolderData> arrayList;
private LayoutInflater inflater;
private ArrayList<ResultHolderData> suggestions;


public static class ResultHolderData {
    public String symbol;
    public String fullName;
    public ResultHolderData(String a, String b) {
        symbol=a;
        fullName=b;
    }
}

public static class ResultHolder {
    public TextView symName;
    public TextView symNameFull;
}
    @Override
public View getView(int position, View convertView, ViewGroup parent) {
    ResultHolder rh;

    if(convertView==null) {
        rh=new ResultHolder();
        convertView=inflater.inflate(R.layout.two_line_dropdown_item, null);
        rh.symName=(TextView) convertView.findViewById(R.id.autocompleteSym);
        rh.symNameFull=(TextView) convertView.findViewById(R.id.autocompleteName);
        convertView.setTag(rh);
    } else {
        rh=(ResultHolder) convertView.getTag();
    }

    //rh.symName.setTextColor(Color.GREEN);

     /***THE BELLOW LINE THROWS THE ERROR***/
    rh.symName.setText(arrayList.get(position).symbol);
    rh.symNameFull.setText(arrayList.get(position).fullName);
    //rh.symName.setText(arrayList.get(position));

    return convertView;
}

ArrayList представляет отфильтрованный набор результатов:

            @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,FilterResults results) {
       if(results.count>0 && results!=null) {
           arrayList=(ArrayList<ResultHolderData>) results.values;
           notifyDataSetChanged();
       } else {
           notifyDataSetInvalidated();
       }

    }

Ошибка возникает иногда, когда у вас есть 2 элемента в раскрывающемся списке, а при вводе другой буквы раскрывающийся список предлагает только один элемент. Затем пишет: Недопустимый индекс 1, размер равен 1.


Мое мнение: обычно это происходит, когда я быстро печатаю, поэтому я предполагаю, что NotifyDataSetChanged выполняется, но publishResults изменяет содержимое массиваList, и это вызывает ошибку. Но опять же, я ожидал бы, что это произойдет в большем количестве ситуаций?

Также выскакивает другая ошибка: Содержимое адаптера изменилось, но ListView не получил уведомления. Убедитесь, что содержимое вашего адаптера не изменяется из фонового потока, а только из потока пользовательского интерфейса.

Какие-нибудь мысли?


person JanBo    schedule 20.09.2013    source источник


Ответы (1)


Проблема заключалась в этой строке в publishResults:

    arrayList=(ArrayList<ResultHolderData>) results.values;

который просто указал arrayList на эти результаты, вместо этого я сделал «мелкую копию» и очистил список перед ним:

      arrayList.clear();
      for(ResultHolderData tempRhd : (ArrayList<ResultHolderData>)results.values)
               arrayList.add(tempRhd);

и проблема решена!

person JanBo    schedule 21.09.2013