【问题标题】:Android - ClassCastException in publishResults method in Custom ArrayAdapterAndroid - 自定义 ArrayAdapter 中的 publishResults 方法中的 ClassCastException
【发布时间】:2014-10-15 19:58:22
【问题描述】:

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

我目前的问题是我在方法 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>();

【问题讨论】:

  • 调试类名:) Log.d("Daemun", "filterResults.values class = " + filterResults.values.getClass().getName());

标签: java android android-arrayadapter


【解决方案1】:

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

您的问题是您的 arraylist 是字符串泛型类型,而您将其转换为

 filterResults.values

我认为是一个

 UserSelect object

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

<UserSelect>

【讨论】:

  • 太好了,它有效!现在我可以开始为我的代码中的其他错误撞墙了:-D
【解决方案2】:

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

只有当底层对象实际具有该类型时,转换运算符才有效。

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多