0

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、サイズは 1 です」と表示されます。


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

また、別のエラーが表示されます: The content of the adapter has changed but ListView does not receive the notifications. アダプターのコンテンツがバックグラウンド スレッドからではなく、UI スレッドからのみ変更されていることを確認してください。

何かご意見は?

4

1 に答える 1

1

問題は、publishResults の次の行でした。

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

arrayList をこれらの結果に向けただけでしたが、代わりに「浅いコピー」を作成し、その前にリストをクリアしました。

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

そして問題解決!

于 2013-09-21T14:34:27.653 に答える