我是android的新手。
我的自定义适配器会在过滤时导致异常。
这是我的代码。 private class DeptAdapter extends ArrayAdapter实现了Filterable {
private ArrayList<Dept> items;
private ArrayList<Dept> mOriginalValues;
public DeptAdapter(Context context, int textViewResourceId, ArrayList<Dept> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.item_listview_2line, null);
}
Dept d = items.get(position);
if (d != null) {
TextView tt = (TextView) v.findViewById(R.id.toptext);
TextView bt = (TextView) v.findViewById(R.id.bottomtext);
if (tt != null){
tt.setText(d.dept_nm);
}
if(bt != null){
bt.setText(d.dept_cd);
}
}
return v;
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
items = (ArrayList<Dept>) results.values; // has the filtered values
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values
ArrayList<Dept> FilteredArrList = new ArrayList<Dept>();
if (mOriginalValues == null) {
mOriginalValues = new ArrayList<Dept>(items); // saves the original data in mOriginalValues
}
if (constraint == null || constraint.length() == 0) {
// set the Original result to return
results.count = mOriginalValues.size();
results.values = mOriginalValues;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < mOriginalValues.size(); i++) {
Dept d = mOriginalValues.get(i);
if (d.dept_cd.toLowerCase().startsWith(constraint.toString()) || d.dept_nm.toLowerCase().startsWith(constraint.toString())) {
FilteredArrList.add(d);
}
}
// set the Filtered result to return
results.count = FilteredArrList.size();
results.values = FilteredArrList;
}
return results;
}
};
return filter;
}
}
class Dept
{
String dept_cd;
String dept_nm;
public Dept(String dept_cd, String dept_nm)
{
this.dept_cd = dept_cd;
this.dept_nm = dept_nm;
}
public String toString()
{
return this.dept_nm+ "(" + this.dept_cd +")" ;
}
}
帮助我任何人...... 我无法理解为什么getView()方法被调用更多items.size()
答案 0 :(得分:16)
请注意,getView()
将在调用超类构造函数时查询superclass
所拥有的项目的大小,这是您最初传递的项目的大小,
super(context, textViewResourceId, items);
因此,当您进行过滤时,超类不知道您已更改了大小。这意味着getCount()
将返回数组的原始大小,这可以理解地大于过滤后的数组。
这意味着您应该覆盖getCount()
方法,以确保返回实际有效大小:
@Override
public int getCount()
{
return items.size();
}
如果要使用它们,还应该覆盖与List操作相关的其他方法(例如获取)。 例如:
@Override
public Dept getItem (int pos){
return items.get(pos);
}
答案 1 :(得分:1)
您需要添加此方法以获得更好的性能:
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return this.items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
答案 2 :(得分:0)
您缺少getCount()
方法,
看看这个demo
我希望它会有所帮助!
答案 3 :(得分:0)
private ArrayList<Dept> items;
private ArrayList<Dept> mOriginalValues;
public DeptAdapter(Context context, int textViewResourceId, ArrayList<Dept> items) {
super(context, textViewResourceId, items);
this.items = items;
this.mOriginalValues=items; //add this line in your code
}