Java 自定义ArrayAdapter中publishResults方法中的Android-ClassCastException
我目前正在创建一个活动,您可以从列表中选择用户,并通过键入其名称的一部分对其进行筛选。我使用一个自定义的ArrayAdapter,其输入来自UserSelect类(int-id、String-name、boolean-selected) 我当前的问题是,我在方法publishResults中得到了一个ClassCastException,这一行更具体:Java 自定义ArrayAdapter中publishResults方法中的Android-ClassCastException,java,android,android-arrayadapter,Java,Android,Android Arrayadapter,我目前正在创建一个活动,您可以从列表中选择用户,并通过键入其名称的一部分对其进行筛选。我使用一个自定义的ArrayAdapter,其输入来自UserSelect类(int-id、String-name、boolean-selected) 我当前的问题是,我在方法publishResults中得到了一个ClassCastException,这一行更具体: users = (ArrayList<UserSelect>)filterResults.values; users=(Array
users = (ArrayList<UserSelect>)filterResults.values;
users=(ArrayList)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();
}
};
}
}
公共类CCSelectAdapter扩展了ArrayAdapter{
私人最终语境;
private List users=new ArrayList();
公共CCSelectAdapter(上下文、列表值){
super(context,R.layout.listview\u cc\u select);
this.context=上下文;
这是用户=值;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
视图行视图=充气机。充气(R.layout.listview\u cc\u select,父项,false);
TextView TextView=(TextView)rowView.findViewById(R.id.ccName);
textView.setText(users.get(position.getName());
返回行视图;
}
public int getCount()
{
返回users.size();
}
公共字符串getItem(int位置)
{
返回users.get(position.getName();
}
公共长getItemId(int位置)
{
返回位置;
}
@凌驾
公共过滤器getFilter()
{
返回新筛选器()
{
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence)
{
FilterResults results=新的FilterResults();
if(charSequence==null | | charSequence.length()==0)
{
结果.价值=用户;
results.count=users.size();
}
其他的
{
List filterResultsData=new ArrayList();
对于(int i=1;i
解决方案(感谢Elltz):
我改变了:
List<String> filterResultsData = new ArrayList<String>();
List filterResultsData=new ArrayList();
致:
List filterResultsData=new ArrayList();
从另一个不同的标签检查我的答案
您的问题是arraylist是字符串泛型类型,您正在将其强制转换为
filterResults.values
我认为这是一个
UserSelect object
因此,将arraylist更改为
<UserSelect>
是传递给
publishResults
的FilterResults
对象,即在performFiltering
中构建的对象?如果是,请注意值字段的类型是String[]
,而不是ArrayList
强制转换运算符仅在基础对象实际具有该类型时才起作用。调试类的名称:)
Log.d(“Daemun”、“filterResults.values class=“+filterResults.values.getClass().getName())代码>太好了,它可以工作!现在我可以开始在我的代码中寻找其他bug了:-D
<UserSelect>