android中阵列适配器的自定义过滤器 公共类SpotAdapter扩展了ArrayAdapter{ 私有数组列表mFilteredList、mUnfilteredList; 专用过滤器; 公共SpotAdapter(上下文上下文、int资源、列表项){ 超级(上下文、资源、项目); mUnfilteredList=(ArrayList)项; mFilteredList=(ArrayList)项; } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 视图v=转换视图; 如果(v==null){ 拉平机vi; vi=LayoutInflater.from(getContext()); v=vi.充气(R.布局.记录行,空); } Spot p=(Spot)mFilteredList.get(位置); 如果(p!=null){ TextView名称视图=(TextView)v.findViewById(R.id.name); TextView地址视图=(TextView)v.findViewById(R.id.address); TextView类型视图=(TextView)v.findViewById(R.id.type); TextView contactView=(TextView)v.findViewById(R.id.contact); ImageView starBtn=(ImageView)v.findViewById(R.id.star); contactView.setVisibility(View.GONE); nameView.setText(p.name); addressView.setText(p.address); setText(p.type==1?“休闲”:“购物”); starBtn.setTag(“+p.id”); starBtn.setVisibility(p.isStar?View.VISIBLE:View.GONE); } 返回v; } @凌驾 公共过滤器getFilter(){ if(mFilter==null){ mFilter=新过滤器(){ @凌驾 受保护的void publishResults(CharSequence约束、FilterResults结果){ mFilteredList=(ArrayList)results.values; 清除(); int count=mFilteredList.size(); 对于(int i=0;i
mFilteredList=new ArrayList(items);当您单击“书签”时,您在做什么?您的适配器是否连接到AutoCompleteTextView?您是否直接调用筛选器?直接调用筛选器,如下面的sAdapter.getFilter().filter(“全选”);sAdapter.getFilter().filter(“书签”);似乎您应该创建两个适配器,那么为什么mUnfilteredList会受到影响?我尝试在构造函数中登录,但它只运行mUnfilteredList=(ArrayList)项;1次,所以它不应该更改,谢谢我猜mUnfilteredList=(ArrayList)items;是错误的,它不应该指向items,但应该指向co-items copymFilteredList或mUnfilteredList?两者都需要是新的ArrayList(items)ok,因此我建议创建两个适配器,因为现在您有三个数据副本,这在大型数据集中可能是一个问题android中阵列适配器的自定义过滤器 公共类SpotAdapter扩展了ArrayAdapter{ 私有数组列表mFilteredList、mUnfilteredList; 专用过滤器; 公共SpotAdapter(上下文上下文、int资源、列表项){ 超级(上下文、资源、项目); mUnfilteredList=(ArrayList)项; mFilteredList=(ArrayList)项; } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 视图v=转换视图; 如果(v==null){ 拉平机vi; vi=LayoutInflater.from(getContext()); v=vi.充气(R.布局.记录行,空); } Spot p=(Spot)mFilteredList.get(位置); 如果(p!=null){ TextView名称视图=(TextView)v.findViewById(R.id.name); TextView地址视图=(TextView)v.findViewById(R.id.address); TextView类型视图=(TextView)v.findViewById(R.id.type); TextView contactView=(TextView)v.findViewById(R.id.contact); ImageView starBtn=(ImageView)v.findViewById(R.id.star); contactView.setVisibility(View.GONE); nameView.setText(p.name); addressView.setText(p.address); setText(p.type==1?“休闲”:“购物”); starBtn.setTag(“+p.id”); starBtn.setVisibility(p.isStar?View.VISIBLE:View.GONE); } 返回v; } @凌驾 公共过滤器getFilter(){ if(mFilter==null){ mFilter=新过滤器(){ @凌驾 受保护的void publishResults(CharSequence约束、FilterResults结果){ mFilteredList=(ArrayList)results.values; 清除(); int count=mFilteredList.size(); 对于(int i=0;i,android,listview,android-listview,filter,adapter,Android,Listview,Android Listview,Filter,Adapter,mFilteredList=new ArrayList(items);当您单击“书签”时,您在做什么?您的适配器是否连接到AutoCompleteTextView?您是否直接调用筛选器?直接调用筛选器,如下面的sAdapter.getFilter().filter(“全选”);sAdapter.getFilter().filter(“书签”);似乎您应该创建两个适配器,那么为什么mUnfilteredList会受到影响?我尝试在构造函数中登录,但它只运行mUnfilteredList=(Arra
public class SpotAdapter extends ArrayAdapter<Spot> {
private ArrayList<Spot> mFilteredList, mUnfilteredList;
private Filter mFilter;
public SpotAdapter(Context context, int resource, List<Spot> items) {
super(context, resource, items);
mUnfilteredList = (ArrayList<Spot>) items;
mFilteredList = (ArrayList<Spot>) items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
v = vi.inflate(R.layout.record_row, null);
}
Spot p = (Spot) mFilteredList.get(position);
if (p != null) {
TextView nameView = (TextView) v.findViewById(R.id.name);
TextView addressView = (TextView) v.findViewById(R.id.address);
TextView typeView = (TextView) v.findViewById(R.id.type);
TextView contactView = (TextView) v.findViewById(R.id.contact);
ImageView starBtn = (ImageView) v.findViewById(R.id.star);
contactView.setVisibility(View.GONE);
nameView.setText(p.name);
addressView.setText(p.address);
typeView.setText(p.type == 1 ? "Leisure" : "Shopping");
starBtn.setTag("" + p.id);
starBtn.setVisibility(p.isStar ? View.VISIBLE : View.GONE);
}
return v;
}
@Override
public Filter getFilter() {
if(mFilter == null) {
mFilter = new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mFilteredList = (ArrayList<Spot>)results.values;
clear();
int count = mFilteredList.size();
for (int i=0; i<count; i++)
{
Spot s = (Spot)mFilteredList.get(i);
add(s);
}
//
// mFilteredList = (ArrayList<Spot>)results.values;
// notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Log.d("test1","c "+constraint);
Log.d("test1","s "+mUnfilteredList.size());
FilterResults results = new FilterResults();
ArrayList<Spot> newList = new ArrayList<Spot>();
for (Spot obj : mUnfilteredList) {
// Compare the custom object and add to list if match
if (constraint.equals("bookmark")) {
if (obj.isStar == true)
newList.add(obj);
} else if (constraint.equals("select all")) {
newList.add(obj);
}
}
Log.d("test1",""+newList.size());
results.values = newList;
results.count = newList.size();
return results;
}
};
}
return mFilter;
}
}