Android - Custom ArrayAdapter中的publishResults方法中的ClassCastException

时间:2014-10-15 11:36:54

标签: java android android-arrayadapter

我目前正在创建一个活动,您可以从列表中选择用户,并通过键入其名称的一部分对其进行过滤。我正在使用自定义ArrayAdapter,其输入来自UserSelect类(int id,String name,boolean selected)。

我目前的问题是我在方法publishResults中得到一个ClassCastException,在这一行中更具体:

users = (ArrayList<UserSelect>)filterResults.values;

知道怎么解决这个问题吗?以前我使用字符串[]并且工作正常,但由于我需要来自对象的id,我现在将其更改为ArrayList。

完整代码:

public class CCSelectAdapter extends ArrayAdapter<String> {

  private final Context context;
  private List<UserSelect> users = new ArrayList<UserSelect>();

  public CCSelectAdapter(Context context,  List<UserSelect> values) {
    super(context, R.layout.listview_cc_select);
    this.context = context;
    this.users = values;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.listview_cc_select, parent, false);
    TextView textView = (TextView) rowView.findViewById(R.id.ccName);
    textView.setText(users.get(position).getName());

    return rowView;
  }

  public int getCount() 
  {
    return users.size();
  }

  public String getItem(int position) 
  {
      return users.get(position).getName();
  }

  public long getItemId(int position) 
  {
      return position;
  }

  @Override
  public Filter getFilter()
  {
     return new Filter()
     {
          @Override
          protected FilterResults performFiltering(CharSequence charSequence)
          {
              FilterResults results = new FilterResults();

              if(charSequence == null || charSequence.length() == 0)
              {
                  results.values = users;
                  results.count = users.size();
              }
              else
              {
                  List<String> filterResultsData = new ArrayList<String>();

                  for (int i = 1 ; i < users.size() ; i++) {
                      if(users.get(i).getName().toLowerCase().contains(((String) charSequence).toLowerCase()))
                      {
                          filterResultsData.add(users.get(i).getName());
                      }
                  }

                  String[] arr = filterResultsData.toArray(new String[filterResultsData.size()]);

                  results.values = arr;
                  results.count = arr.length;
              }
              return results;
          }

          @Override
          protected void publishResults(CharSequence charSequence, FilterResults filterResults)
          {
            users = (ArrayList<UserSelect>)filterResults.values;
            notifyDataSetChanged();
          }
      };
  }

} 

解决方案(感谢Elltz): 我改变了:

List<String> filterResultsData = new ArrayList<String>();

为:

List<UserSelect> filterResultsData = new ArrayList<UserSelect>();

2 个答案:

答案 0 :(得分:1)

从另一个不同的标记question

中查看我的答案

你的问题是你的arraylist是一个字符串泛型类型,你将它转换为

 filterResults.values

我认为是

 UserSelect object

所以将你的arraylist改为

<UserSelect>

答案 1 :(得分:0)

您传递给FilterResults的{​​{1}}对象是publishResults中正在构建的对象吗?如果是,请注意,值字段的类型为performFiltering,而不是String[]

仅当底层对象实际具有该类型时,强制转换操作符才有效。