自定义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>();
# 1 楼答案
从另一个不同的标签question检查我的答案
你的问题是你的arraylist是一个字符串泛型类型,你要将它转换为
我认为这是一个
所以把你的arraylist改成
# 2 楼答案
传递给
publishResults
的FilterResults
对象是在performFiltering
中构建的对象吗?如果是这样,请注意值字段的类型是String[]
,而不是ArrayList<UserSelect>
仅当基础对象实际具有该类型时,强制转换操作符才起作用