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

标签 java android android-arrayadapter

我当前正在创建一个 Activity ,您可以在其中从列表中选择用户并通过键入其姓名的一部分来过滤他们。我正在使用自定义 ArrayAdapter,其输入来自 UserSelect 类(int id、字符串名称、选择的 boolean 值)。

我当前的问题是我在方法publishResults中遇到了ClassCastException,并且在这一行中更具体:

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

知道如何解决这个问题吗?以前我使用过 string[] 并且有效,但由于我需要对象的 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>();

最佳答案

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

你的问题是你的数组列表是一个字符串泛型类型,你将它转换为

 filterResults.values

我认为这是一个

 UserSelect object

所以将你的数组列表更改为

<UserSelect>

关于java - Android - 自定义 ArrayAdapter 中的publishResults 方法中的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26381579/

相关文章:

java - Grails:Linux 上的 JSON.parse() 错误 - 适用于 Windows - 难住了

java - 序列化对象解密(和其他字节字段)期间出现 StreamCorruptedException

Android Systrace 跟踪文件格式

android - Android 如何决定使用哪个布局文件夹?

android - 在 ListView 的 ArrayAdapter 中使用 Linkify 导致 RuntimeException

java - 插件未随应用程序启动

java - maven-jar-plugin 中的 NPE

android - 如何检查是否安装了拨号器应用程序?

android - 未找到资源异常

android - "ArrayAdapter requires the resource ID to be a TextView"XML 问题