自定义BaseAdapter for AutoCompleteTextView的错误(indexOutOfBounds&内容已更改,但没有通知)

时间:2013-09-20 15:27:14

标签: android android-listview baseadapter autocompletetextview

我创建了自己的适配器,扩展了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表示过滤的resultSet:

            @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会更改arrayList的内容,这会导致错误。但是,我希望在更多情况下会发生这种情况吗?

还会弹出另一个错误:适配器的内容已更改,但ListView未收到通知。确保不从后台线程修改适配器的内容,而只是从UI线程修改。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题是publishResults中的这一行:

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

只是将arrayList指向那些结果,而是我做了一个“浅拷贝”并清除了它之前的列表:

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

问题解决了!