Android自定义适配器筛选不起作用

时间:2015-02-06 10:15:38

标签: android custom-adapter

我在片段中使用带有搜索过滤器的自定义适配器,但结果不会在搜索中过滤,我调试并逐步执行我的代码并发现它说的是args.listenere = null!。这是什么意思,我该如何纠正?我的代码如下:

---------自定义适配器-------

public class SalesPartAdapter extends BaseAdapter implements Filterable {
    private ArrayList<SalesPartItem> listData;
    private ArrayList<SalesPartItem> filteredData;
    private SalesPartFilter filter;
    private Context _context;
    private LayoutInflater layoutInflater;
    public SalesPartAdapter(Context context, ArrayList<SalesPartItem> listData) {
        this.listData = listData;
        layoutInflater = LayoutInflater.from(context);
        _context = context;

    }
    @Override
    public int getCount() {
        return listData.size();
    }

    @Override
    public Object getItem(int position) {
        return listData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        //set background colour

        if (convertView == null) {
            //set up holder
            convertView = layoutInflater.inflate(R.layout.salespart_item, null);
            holder = new ViewHolder();
            holder.salesPartCodeView = (TextView) convertView.findViewById(R.id.salesPartCode);
            holder.salesPartDescView = (TextView) convertView.findViewById(R.id.salesPartDescription);
            holder.salesPartColourBar= (ImageView) convertView.findViewById(R.id.colourBar);
            convertView.setTag(holder);
        } else {
            //use existing holder
            holder = (ViewHolder) convertView.getTag();
        }

        SalesPartItem salespartView = (SalesPartItem) listData.get(position);
        holder.salesPartCodeView.setText(salespartView.SalesPartCode);
        holder.salesPartDescView.setText(salespartView.SalesPartDescription);
        holder.salesPartColourBar.setBackgroundColor(Color.parseColor(salespartView.Colour));//String.valueOf(salespartView.Colour);

        return convertView;
    }

    /********* holder Class to contain previously inflated xml file elements *********/
    static class ViewHolder {
        TextView salesPartCodeView;
        TextView salesPartDescView;
        ImageView salesPartColourBar;
    }

    public Filter getFilter() {
        if (filter == null){
            filter  = new SalesPartFilter();
        }
        return filter;
    }

    ArrayList<SalesPartItem> filteredItems;
    ArrayList<Integer>countFilteredItems;
    private class SalesPartFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();
            if(constraint != null && constraint.toString().length() > 0)
            {
                filteredItems = new ArrayList<SalesPartItem>();
               // countFilteredItems = new ArrayList<Integer>();
                for(int i = 0, l = listData.size(); i < l; i++)
                {
                    SalesPartItem salesPartItem = listData.get(i);
                    if(salesPartItem.SalesPartDescription.toString().toLowerCase().contains(constraint))
                        filteredItems.add(salesPartItem);
                       // countFilteredItems.add(i);
                }
                result.count = filteredItems.size();
                result.values = filteredItems;
            }
            else
            {
                synchronized(this)
                {
                    result.values = listData;
                    result.count = listData.size();
                }
            }
            return result;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
           // notifyDataSetChanged();
            if (results.count > 0) {
                listData =(ArrayList<SalesPartItem>)results.values;
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    }
}

----------------处理列表视图的片段代码-------------------

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    //USE SAMPLE ID TO GET SALES PARTS LIST FROM DATABASE
    addSalesParts.setEnabled(false);
    //ListViewModel (SalesPartId,salesPartName,NotUsed)
    final int numberOfAddedSalesParts = 3;
    SalesPartItem sp;
    //  fill with some dummy data for now.
    for (long i = 1; i < numberOfAddedSalesParts; i++) {
        sp = new SalesPartItem();
        sp.SalesPartItemId = i;
        sp.SalesPartCode = "LEU" + i;

        if(i!=2){
            sp.SalesPartDescription = "Sales Part " + i;
        }
        else{
            sp.SalesPartDescription = "TSalZes Part " + i;
        }
        sp.Colour = "#cccccc";
        salesPartListViewItems.add(sp);
    }

    // Start of Search filtering
    mListView = (ListView) getActivity().findViewById(R.id.salespartsList);
    //click on item - edit order

    mListView.setTextFilterEnabled(true);


    //display the list via our custom adapter
    mListView.setAdapter(new SalesPartAdapter(getActivity(), salesPartListViewItems);

    EditText searchField = (EditText) getActivity().findViewById(R.id.typeFindSalesPart);
    searchField.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) {
            //TODO Search Lists from Database and filter accordingly
            SalesPartAdapter SA = new SalesPartAdapter(getActivity(), salesPartListViewItems);
            SA.getFilter().filter(s.toString());
            Toast.makeText(getActivity(), s, Toast.LENGTH_SHORT).show();
           // salesPartListViewItems.contains(s);
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }
    });

1 个答案:

答案 0 :(得分:0)

我现在解决了这个问题,问题是我在文本观察器中创建了一个新的适配器实例。一旦我将其设置为使用创建原始列表的适配器,那么它工作正常