2015-02-06 211 views
1

我在一个片段中使用了一个带有搜索筛选器的自定义适配器,但是结果没有在搜索过滤器上进行筛选,我调试并逐步检查了我的代码,发现它是说args.listenere = null!这是什么意思,我该如何纠正?我的代码如下:Android自定义适配器筛选器不起作用

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

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) { 

     } 
    }); 

回答

0

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

相关问题