AutoCompleteTextView的自定义布局和过滤器

时间:2013-09-21 12:11:59

标签: java android listview android-arrayadapter autocompletetextview

我创建了自己的适配器,扩展了BaseAdapter实现的Filterable。

1。我偶尔会在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.或者大小为0 ..


我的观点:它通常发生在我快速键入时,所以我假设NotifyDataSetChanged正在进行中,但是publishResults会更改arrayList的内容,这会导致错误。但是,我希望在更多情况下会发生这种情况吗?

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

我改变适配器内容的唯一地方是publishResults吗?为什么会发生这种情况?

这显然我在这里弄错了,或者我不完全理解这是如何工作的。

1 个答案:

答案 0 :(得分:0)

因为我在绝望时两次发布同一个问题,所以我给出了答案:Errors with custom BaseAdapter for AutoCompleteTextView(indexOutOfBounds & content changed but no notification)

问题是publishResults中的这一行:

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

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

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

问题解决了!

相关问题