我目前正在创建一个活动,您可以从列表中选择用户,并通过键入其名称的一部分对其进行过滤。我正在使用自定义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>();
答案 0 :(得分:1)
从另一个不同的标记question
中查看我的答案你的问题是你的arraylist是一个字符串泛型类型,你将它转换为
filterResults.values
我认为是
UserSelect object
所以将你的arraylist改为
<UserSelect>
答案 1 :(得分:0)
您传递给FilterResults
的{{1}}对象是publishResults
中正在构建的对象吗?如果是,请注意,值字段的类型为performFiltering
,而不是String[]
。
仅当底层对象实际具有该类型时,强制转换操作符才有效。