2017-04-17 24 views
-1

我已经创建了ListView,并且我想对此列表视图应用搜索过滤器。我已经执行了代码如下。但在performFiltering()期间,它在Logcat中显示错误。对于ListView执行过滤器()期间发生异常

logcat的

W/PathParser: Points are too far apart 4.000000596046461 
W/Filter: An exception occurred during performFiltering()! 
      java.lang.NullPointerException: collection == null 
       at java.util.ArrayList.<init>(ArrayList.java:94) 
       at com.example.chaitanya.nearbyplace.CustomBaseAdapter$1.performFiltering(CustomBaseAdapter.java:156) 
       at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:135) 
       at android.os.HandlerThread.run(HandlerThread.java:61) 
D/[email protected]: FilterResult 

CustomeBaseAdapter

public class CustomBaseAdapter extends BaseAdapter implements Filterable { 
    Context context; 
    List<RowItem> rowItems; 

    List<String> arrayList; 
    List<String> mOriginalValues; // Original Values 
    LayoutInflater inflater; 




    public CustomBaseAdapter(Context context, List<RowItem> items) { 
     this.context = context; 
     this.rowItems = items; 
    } 

    /*private view holder class*/ 
    private class ViewHolder { 
     ImageView imageView; 
     TextView txtTitle; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     LayoutInflater mInflater = (LayoutInflater) 
       context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item, null); 
      holder = new ViewHolder(); 
      holder.txtTitle = (TextView) convertView.findViewById(R.id.label); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.icon); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     RowItem rowItem = (RowItem) getItem(position); 

     holder.txtTitle.setText(rowItem.getTitle()); 
     holder.imageView.setImageResource(rowItem.getImageId()); 

     return convertView; 
    } 

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

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

    @Override 
    public long getItemId(int position) { 
     return rowItems.indexOf(getItem(position)); 
    } 


    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint,FilterResults results) { 


       arrayList = (List<String>) results.values; // has the filtered values 
       notifyDataSetChanged(); // notifies the data with new filtered values 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       Log.d(constraint.toString(),"constraint"); 
       FilterResults results = new FilterResults();  // Holds the results of a filtering operation in values 
       List<String> FilteredArrList = new ArrayList<String>(); 

       if (mOriginalValues == null) { 
        mOriginalValues = new ArrayList<String>(arrayList); // saves the original data in mOriginalValues 
       } 

       /******** 
       * 
       * If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values 
       * else does the Filtering and returns FilteredArrList(Filtered) 
       * 
       ********/ 
       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++) { 
         String data = mOriginalValues.get(i); 
         if (data.toLowerCase().contains(constraint.toString())) { 
          FilteredArrList.add(data); 
         } 
        } 
        // set the Filtered result to return 
        results.count = FilteredArrList.size(); 
        results.values = FilteredArrList; 
       } 
       return results; 
      } 
     }; 
     return filter; 
    } 


} 

MainActivity.java

inputSearch.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
     // When user changed the Text 
     MainActivity.this.adapter.getFilter().filter(cs.toString()); 
     // String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault()); 
     //adapter.filter(text); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
            int arg3) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
     // TODO Auto-generated method stub 
    } 
}); 

if (mOriginalValues == null) { mOriginalValues = new ArrayList<String>(arrayList); // saves the original data in mOriginalValues }在此区块if (mOriginalValues == null) {CustomeBaseAdapter中的156行。

+1

什么是线156? –

+0

'if(mOriginalValues == null){mOriginalValues = new ArrayList (arrayList); //将原始数据保存在mOriginalValues } in this block中if(mOriginalValues == null){'是156行。 –

+0

请编辑您的问题以显示此项。最可能的罪魁祸首是'arrayList'为空。使用调试器来确认这一点并找出原因。 –

回答

1

您的arrayList似乎为空。

更新CustomBaseAdapter构造如下:

public CustomBaseAdapter(Context context, List<RowItem> items) { 
     this.context = context; 
     this.rowItems = items; 

     arrayList = new ArrayList<String>(); 
     for(int i = 0; i < rowItems.size(); i++) 
     { 
      RowItem rowItem = (RowItem) getItem(position); 
      arrayList.add(rowItem.getTitle()); 
     } 
    } 

performFiltering做到这一点:

........... 
....................... 

if (mOriginalValues == null) { 
    mOriginalValues.addAll(arrayList); // saves the original data in mOriginalValues 
} 
............ 
................... 
+0

在Logcat中它的显示错误:(38,18)错误:找不到适用于addAll的方法(列表) 方法Collection.addAll(Collection <?extends String>)不适用 (参数不匹配;列表不能被转换为Collection <?extends String>) 方法List.addAll(Collection <?extends String>)不适用 (参数不匹配;列表不能转换为Collection <?extends String>) –

+0

请尝试更新的答案 – FAT

+0

我应该更改'publishResults'方法中的任何内容。因为现在它显示'java.lang.NullPointerException:尝试调用'mOriginalValues.addAll(arrayList)'行的null对象引用上的接口方法'boolean java.util.List.addAll(java.util.Collection)'; ' –

相关问题