簡體   English   中英

自定義布局和AutoCompleteTextView的篩選器

[英]Custom layout and filter for 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? 為什么會這樣呢?

很明顯,我在這里出錯了,或者我不完全理解這是如何工作的。

由於我在絕望時曾兩次發布相同的問題,因此我給出了答案: AutoCompleteTextView的自定義BaseAdapter錯誤(indexOutOfBounds和內容已更改,但沒有通知)

問題是publishResults中的這一行:

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

它只是將arrayList指向這些結果,相反,我進行了“淺表復制”並清除了之前的列表:

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

問題解決了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM