Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView中自定义ArrayAdapter的自定义筛选_Android_Filter_Android Listview_Android Arrayadapter - Fatal编程技术网

Android ListView中自定义ArrayAdapter的自定义筛选

Android ListView中自定义ArrayAdapter的自定义筛选,android,filter,android-listview,android-arrayadapter,Android,Filter,Android Listview,Android Arrayadapter,我自己写了一个ArrayAdapter,如下所示: public class PoiListAdapter extends ArrayAdapter<Poi> implements Filterable { private Context context; private final List<Poi> valuesPoi; private ItemsFilter mFilter; public PoiListAdapter(Conte

我自己写了一个ArrayAdapter,如下所示:

public class PoiListAdapter extends ArrayAdapter<Poi> implements Filterable {

    private Context context;
    private final List<Poi> valuesPoi;
    private ItemsFilter mFilter;

    public PoiListAdapter(Context context, List<Poi> valuesPoi) {
        super(context, R.layout.poilist);
        this.context = context;
        this.valuesPoi = valuesPoi;
    }

    @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.poilist, parent, false);
        TextView textViewName = (TextView) rowView.findViewById(R.id.name_poi);
        TextView textViewDis = (TextView) rowView
                .findViewById(R.id.discrip_poi);
        textViewName.setText(valuesPoi.get(position).getName());
        textViewDis.setText(valuesPoi.get(position).getDiscription());
        return rowView;
    }

    /**
     * Implementing the Filterable interface.
     */
    public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new ItemsFilter(this);
        }
        return mFilter;
    }

    public List<Poi> getValuesPoi() {
        return valuesPoi;
    }

    public void addValuesPoi(Poi p) {
        valuesPoi.add(p);
    }
      @Override
  public void clear() {
    valuesPoi.clear();
  }
}
我想问题是我想修改access下的Arraylist。我想我必须使用synchronized,但我以前从未使用过它

更新: 这个问题解决了!代码如下:

for(Iterator<Poi> i = fitems.iterator(); i.hasNext();) {
        Poi p = i.next();
        poiListAdapter.addValuesPoi(p);
        //poiListAdapter.notifyDataSetChanged();
    }
for(迭代器i=fitems.Iterator();i.hasNext();){
Poi p=i.next();
poiListAdapter.addValuesPoi(p);
//poiListAdapter.notifyDataSetChanged();
}
2。问题


列表视图在开始时为空。在开始时,我想显示所有元素!搜索元素时也不会显示任何内容!Listview目前没有显示任何内容

for-each循环在内部使用迭代器,在迭代时不能向集合中添加任何内容(这就是异常的原因)。尝试创建ArrayList的新实例并在其上交互

@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    ArrayList<Poi> fitems = new ArrayList((ArrayList<Poi>) results.values);
    poiListAdapter.clear();
    for (Poi p : fitems) {
        poiListAdapter.addValuesPoi(p);
        poiListAdapter.notifyDataSetChanged();
    }
}
@SuppressWarnings(“未选中”)
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
ArrayList fitems=新的ArrayList((ArrayList)results.values);
poiListAdapter.clear();
对于(Poi p:fitems){
poiListAdapter.addValuesPoi(p);
poiListAdapter.notifyDataSetChanged();
}
}
每种方法的适用范围如下:

for(Iterator<Poi> i = fitms.iterator(); i.hasNext(); ) {
  Poi item = i.next();    
}
for(迭代器i=fitms.Iterator();i.hasNext();){
Poi项目=i.下一步();
}
问题2:


列表在开始时是空的,可能是因为您提交的数据集是空的。

for each循环在内部使用迭代器,并且您在迭代时不能向集合中添加任何内容(这就是异常的原因)。尝试创建ArrayList的新实例并在其上交互

@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    ArrayList<Poi> fitems = new ArrayList((ArrayList<Poi>) results.values);
    poiListAdapter.clear();
    for (Poi p : fitems) {
        poiListAdapter.addValuesPoi(p);
        poiListAdapter.notifyDataSetChanged();
    }
}
@SuppressWarnings(“未选中”)
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
ArrayList fitems=新的ArrayList((ArrayList)results.values);
poiListAdapter.clear();
对于(Poi p:fitems){
poiListAdapter.addValuesPoi(p);
poiListAdapter.notifyDataSetChanged();
}
}
每种方法的适用范围如下:

for(Iterator<Poi> i = fitms.iterator(); i.hasNext(); ) {
  Poi item = i.next();    
}
for(迭代器i=fitms.Iterator();i.hasNext();){
Poi项目=i.下一步();
}
问题2:


列表在开始时为空可能是因为您提交的数据集为空

可以通过两种方式避免Concurrent修改:

  • poiListAdapter.addValuesPoi(p)在同步方法中添加此代码。无法同时访问同步方法

  • 使用Collections.synchronizedList


  • 可以通过两种方式避免并发修改:

  • poiListAdapter.addValuesPoi(p)在同步方法中添加此代码。无法同时访问同步方法

  • 使用Collections.synchronizedList


  • 我可以解决我的问题。这是我的解决方案

        package hsos.ds.helper;
    
    import hsos.ds.db.Poi;
    
    import java.util.ArrayList;
    import java.util.List;
    import android.widget.Filter;
    
    public class ItemsFilter extends Filter {
    
        private PoiListAdapter poiAdapter;
        private List<Poi> valuesPoi;
        private List<Poi> filteredPoi;
    
        public ItemsFilter(PoiListAdapter _poiAdapter) {
            this.poiAdapter = _poiAdapter;
            this.valuesPoi = poiAdapter.getValuesPoi();
            this.filteredPoi = poiAdapter.getFilteredPoi();
        }
    
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults result = new FilterResults();
            constraint = constraint.toString().toLowerCase();
    
            if (constraint == null || constraint.length() == 0) {
                ArrayList<Poi> list = new ArrayList<Poi>(valuesPoi);
                result.values = valuesPoi;
                result.count = valuesPoi.size();
    
            } else {
                final ArrayList<Poi> orginalList = new ArrayList<Poi>(valuesPoi);
                final ArrayList<Poi> filterList = new ArrayList<Poi>();
                int count = orginalList.size();
                for (int i = 0; i < count; i++) {
                    final Poi p = orginalList.get(i);
                    if (p.getName().toLowerCase().contains(constraint))
                        filterList.add(p);
                }
                result.values = filterList;
                result.count = filterList.size();
            }
            return result;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filteredPoi = (List<Poi>) results.values;
            poiAdapter.notifyDataSetChanged();
            poiAdapter.clear();
            int count = filteredPoi.size();
            for (int i = 0; i < count; i++) {
                poiAdapter.add(filteredPoi.get(i));
                poiAdapter.notifyDataSetInvalidated();
            }
        }
    }
    

    我可以解决我的问题。这是我的解决方案

        package hsos.ds.helper;
    
    import hsos.ds.db.Poi;
    
    import java.util.ArrayList;
    import java.util.List;
    import android.widget.Filter;
    
    public class ItemsFilter extends Filter {
    
        private PoiListAdapter poiAdapter;
        private List<Poi> valuesPoi;
        private List<Poi> filteredPoi;
    
        public ItemsFilter(PoiListAdapter _poiAdapter) {
            this.poiAdapter = _poiAdapter;
            this.valuesPoi = poiAdapter.getValuesPoi();
            this.filteredPoi = poiAdapter.getFilteredPoi();
        }
    
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults result = new FilterResults();
            constraint = constraint.toString().toLowerCase();
    
            if (constraint == null || constraint.length() == 0) {
                ArrayList<Poi> list = new ArrayList<Poi>(valuesPoi);
                result.values = valuesPoi;
                result.count = valuesPoi.size();
    
            } else {
                final ArrayList<Poi> orginalList = new ArrayList<Poi>(valuesPoi);
                final ArrayList<Poi> filterList = new ArrayList<Poi>();
                int count = orginalList.size();
                for (int i = 0; i < count; i++) {
                    final Poi p = orginalList.get(i);
                    if (p.getName().toLowerCase().contains(constraint))
                        filterList.add(p);
                }
                result.values = filterList;
                result.count = filterList.size();
            }
            return result;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filteredPoi = (List<Poi>) results.values;
            poiAdapter.notifyDataSetChanged();
            poiAdapter.clear();
            int count = filteredPoi.size();
            for (int i = 0; i < count; i++) {
                poiAdapter.add(filteredPoi.get(i));
                poiAdapter.notifyDataSetInvalidated();
            }
        }
    }
    

    @JavaNullPointer:我和你有同样的问题。我试图实现这里提供的解决方案,但遇到了不同类型的问题。。经过一段时间的思考,我假设默认过滤器可能使用对象的toString()方法进行过滤。。。这件事对我来说是对的。这帮我省去了很多麻烦

    在阅读代码时,我相信您希望按Poi类的名称字段进行过滤。如果是这样的话,那么快速的解决方案就是 解决方案:

    public class Poi{
    
    //your constructors and methods
    
    @Override
    public String toString(){
       return getName(); 
    }
    

    @JavaNullPointer:我和你有同样的问题。我试图实现这里提供的解决方案,但遇到了不同类型的问题。。经过一段时间的思考,我假设默认过滤器可能使用对象的toString()方法进行过滤。。。这件事对我来说是对的。这帮我省去了很多麻烦

    在阅读代码时,我相信您希望按Poi类的名称字段进行过滤。如果是这样的话,那么快速的解决方案就是 解决方案:

    public class Poi{
    
    //your constructors and methods
    
    @Override
    public String toString(){
       return getName(); 
    }
    

    第一个问题解决了!第一个问题解决了!你知道怎么解决这个问题吗?你知道怎么解决这个问题吗?