2012-08-06 31 views
0

我想通過創建一個自定義過濾器在LazyAdapter類上執行搜索。但是當我嘗試使用TextWatcher執行搜索時,應用程序正在強制關閉。 LazyAdapter類的代碼如下: package com.demo.directory; 公共類LazyAdapter延伸BaseAdapter {在LazyAdapter的NullPointerException

private Activity activity; 
private ArrayList<HashMap<String, String>> data; 
private static LayoutInflater inflater = null; 
public ImageLoader imageLoader; 

public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
    activity = a; 
    data = d; 
    inflater = (LayoutInflater) activity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader = new ImageLoader(activity.getApplicationContext()); 
} 

public View getFilter(CharSequence seq, View convertView) { 

    String name_org; 
    View vi = convertView; 
    convertView = null; 
    if (convertView == null) 
     vi = inflater.inflate(R.layout.list_row, null); 

    TextView name = (TextView) vi.findViewById(R.id.name_org); // title 
    TextView address = (TextView) vi.findViewById(R.id.address_org); // artist 
                     // name 
    ImageView thumb_image = (ImageView) vi.findViewById(R.id.list_image); // thumb 
                      // image 

    for (int i = 0; i < data.size(); i++) { 
     HashMap<String, String> org = new HashMap<String, String>(); 
     org = data.get(i); 
     name_org = org.get(OrganizationActivity.KEY_NAME); 

     if (name_org != null && seq != null) { 
      if (name_org.contains(seq)) { 
       name.setText(org.get(OrganizationActivity.KEY_NAME)); 
       address.setText(org.get(OrganizationActivity.KEY_CITY) 
         + ", " + org.get(OrganizationActivity.KEY_STATE)); 
       imageLoader.DisplayImage(
         org.get(OrganizationActivity.KEY_IMAGE_URL), 
         thumb_image); 
       notifyDataSetChanged(); 
      } else { 
       org.remove(OrganizationActivity.KEY_NAME); 
      } 
     } 
    } 
    return vi; 
} 

public int getCount() { 
    return data.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    if (convertView == null) 
     vi = inflater.inflate(R.layout.list_row, null); 

    TextView name = (TextView) vi.findViewById(R.id.name_org); // title 
    TextView address = (TextView) vi.findViewById(R.id.address_org); // artist 
                     // name 
    ImageView thumb_image = (ImageView) vi.findViewById(R.id.list_image); // thumb 
                      // image 

    HashMap<String, String> org = new HashMap<String, String>(); 
    org = data.get(position); 

    // Setting all values in listview 
    name.setText(org.get(OrganizationActivity.KEY_NAME)); 
    address.setText(org.get(OrganizationActivity.KEY_CITY) + ", " 
      + org.get(OrganizationActivity.KEY_STATE)); 
    imageLoader.DisplayImage(org.get(OrganizationActivity.KEY_IMAGE_URL), 
      thumb_image); 
    return vi; 
} 
} 

上面的代碼是現在的工作,但它並沒有顯示任何東西,如果我刪除搜索數據,即,ListView中的原始數據,如果該數據的EditText不會返回在搜索後清除。

回答

1

要在清除搜索編輯文本後保留數據項目,以下代碼很有用。希望這可以幫助你。

public Filter getFilter() 
{ 
    Filter filter = new Filter() 
    {   
     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) 
     { 
      System.out.println(" --- constraint in publishResults --- "+constraint+" - results - "+results); 
      itemDetailList = (List<Dish>)results.values; 
      notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) 
     { 
      FilterResults filterResults = new FilterResults(); 
      List<Dish> filtered_list = new ArrayList<Dish>(); 
      if(originalItemsDetails == null) 
      { 
       System.out.println(" --- originalItemsDetails IS NULL --- "); 
       originalItemsDetails = new ArrayList<Dish>(itemDetailList); 
      } 
      else 
      { 
       System.out.println(" --- originalItemsDetails NOT NULL --- "); 
      } 

      if(constraint == null || constraint.length() == 0) 
      { 
       filterResults.count = originalItemsDetails.size(); 
       filterResults.values = originalItemsDetails; 
      } 
      else 
      { 
       constraint = constraint.toString().toLowerCase(); 
       for(int i=0; i<originalItemsDetails.size(); i++) 
       { 
        String dataNames = originalItemsDetails.get(i).getDishName().toLowerCase(); 
        if(dataNames.startsWith(constraint.toString())) 
        { 
         filtered_list.add(originalItemsDetails.get(i)); 
        } 
       } 

       filterResults.count = filtered_list.size(); 
       System.out.println(" --- filterResults.count --- "+filterResults.count); 

       filterResults.values = filtered_list; 
       System.out.println(" --- filterResults.values --- "+filterResults.values); 
      } 

      System.out.println(" --- constraint in performFiltering --- "+constraint); 

      return filterResults; 
     } 
    }; 

    return filter; 
} 
+1

好!這幫了我很多...謝謝@Basavaraj .. – 2012-08-07 04:29:32

+0

歡迎:) – Braj 2012-08-07 05:20:44

+0

如果你喜歡這個問題,請投票!.. @Basavaraj .. – 2012-08-07 05:52:48

1

您確定您的name_orgs變量不是null ???

你必須首先檢查它一樣,

if(name_org != null && s != null) 
{ 
if(name_org.contains(s)) 
{ 
// Your other stuff goes here... 
. 
. 
} 
} 
+1

是啊...我檢查了它,並實現了非空條件也..但它仍然顯示相同的錯誤...空指針異常在行如果(name_org.contains(s))... – 2012-08-06 07:16:32

+1

發佈logcat錯誤與您的問題.. – user370305 2012-08-06 07:17:34

+0

ListView現在顯示結果終於...但如果現在它不過濾任何東西... – 2012-08-06 07:24:52

0

我覺得s爲null,你檢查它。因爲即使通過的charsequence爲null,包含方法也會引發NPE

1

您可以嘗試創建一個自定義過濾器,一旦編輯文本中的數據變爲空時,可以幫助將數據顯示回來。或者,您可以爲列表視圖創建兩個適配器,第一個包含listview的原始數據,第二個顯示編輯文本搜索的搜索結果。一旦編輯文本中的數據變爲空白,將List Adapter設置爲初始值。

相關問題