有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

自定义ArrayAdapter中publishResults方法中的java Android ClassCastException

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

我目前的问题是,我在method 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) 个答案

  1. # 1 楼答案

    从另一个不同的标签question检查我的答案

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

     filterResults.values
    

    我认为这是一个

     UserSelect object
    

    所以把你的arraylist改成

    <UserSelect>
    
  2. # 2 楼答案

    传递给publishResultsFilterResults对象是在performFiltering中构建的对象吗?如果是这样,请注意值字段的类型是String[],而不是ArrayList<UserSelect>

    仅当基础对象实际具有该类型时,强制转换操作符才起作用