0

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、サイズは1です。または、サイズは0です..


私の意見:通常、高速で入力しているときに発生するため、NotifyDataSetChangedが進行中であると想定していますが、publishResultsがarrayListの内容を変更し、これがエラーを引き起こします. しかし、もう一度、これがより多くの状況で起こると思いますか?

2.また、別のエラーが表示されます。アダプターのコンテンツが変更されましたが、ListView は通知を受け取りませんでした。アダプターのコンテンツがバックグラウンド スレッドからではなく、UI スレッドからのみ変更されていることを確認してください。

そして、アダプターの内容を変更する唯一の場所は、publishResults ですか? では、なぜこれが起こっているのでしょうか?

ここで何か間違っていることは明らかです。または、これがどのように機能するかを完全に理解していません。

4

1 に答える 1