2014-10-01 147 views
0

我從服務器列出不同的數據。考慮我的列表中有5種不同類型的數據。我想根據一個數據過濾列表。爲此我寫了下面的代碼。Android:ListView過濾器不能正常工作

eventFilter = (EditText) rootView.findViewById(R.id.eventFilter); 
eventFilter.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     // TODO Auto-generated method stub 

    }  

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     // TODO Auto-generated method stub 
     search_data = s.toString(); 
    } 
}); 
Button searchbtn = (Button) rootView.findViewById(R.id.searchbtn); 
searchbtn.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     search = new SearchFilter(context, cts); 
     search.getFilter().filter(search_data); 
    } 
}); 

在上面的代碼中,只是將文本值傳遞給SearchFilter。

@Override 
public Filter getFilter() { 
    // TODO Auto-generated method stub 
    if(cFilter==null) 
    { 
     cFilter=new CustomFilter(); 
    } 
    return cFilter; 
} 
public class CustomFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence prefix) { 

     FilterResults results = new FilterResults(); 

     if (mOriginalValues == null) { 
      synchronized (mLock) { 
       mOriginalValues = new ArrayList<CalEvent>(event); 
      } 
     } 

     if (prefix == null || prefix.length() == 0) { 
      ArrayList<CalEvent> list; 
      synchronized (mLock) { 
       list = new ArrayList<CalEvent>(mOriginalValues); 
      } 
      results.values = list; 
      results.count = list.size(); 
     } else { 
      String prefixString = prefix.toString().toLowerCase(); 


      ArrayList<CalEvent> values; 
      synchronized (mLock) { 
       values = new ArrayList<CalEvent>(mOriginalValues); 
      } 

      final int count = values.size(); 
      final ArrayList<CalEvent> newValues = new ArrayList<CalEvent>(); 

      for (int i = 0; i < count; i++) { 
       CalEvent value=values.get(i); 
       EventType type = EventType.getEventType(value.event_type); 
       String valueText = type.name.toLowerCase(); 
       if (valueText.indexOf(prefixString)!=-1) { 
        newValues.add(value); 
        Toast.makeText(ctx, value.toString(), Toast.LENGTH_SHORT).show(); 
        Log.i("value.toString",value.toString()); 
       } else { 
        ProjectEventFragment.cts.clear(); 
        ProjectEventFragment.adapter.notifyDataSetChanged(); 
       } 
      } 

      results.values = newValues; 
      results.count = newValues.size(); 
     } 

     return results; 
    } 
} 

這裏,如果我輸入一些數據,是不在列表中可用,則該列表應該是空的,或者如果可用,那麼它應該列出基於可用的數據。如果數據不可用,那麼我正在清除並設置爲notifyDataSetChanged。當我輸入非可用數據時,列表將刪除所有數據。但是,當我輸入可用數據時,它不會顯示所有數據。

我不知道我在哪裏做錯了。請糾正我。

回答

0

除非你在這裏發佈完整的代碼,否則我很難完全理解它。您可能會犯的錯誤是查詢原始數據集,當您在搜索欄中輸入null時可能會被清除。嘗試將原始數據集存儲爲臨時數據集,然後查詢臨時數據集而不是原始數據集。當用戶輸入null顯示原始數據集時,以及何時鍵入內容,然後查詢臨時數據集。看看下面提供的示例,這應該有所幫助。

protected FilterResults performFiltering(CharSequence query) { 
       FilterResults results = new FilterResults(); 
       ArrayList<Notification> resultList = new ArrayList<Notification>(); 
       ArrayList<TagUser> receivingUsers = new ArrayList<TagUser>(); 

       if (query == null || query.length() == 0) { 
        results.values = tempNotifcationList; 
        results.count = tempNotifcationList.size(); 

       } else { 
        for (int i = 0; i < tempNotifcationList.size(); i++) { 
         String sendingUser = tempNotifcationList.get(i).getTag().getSendingUser().getDisplayName(); 
         String message = tempNotifcationList.get(i).getTag().getMessage(); 
         if (sendingUser != null) { 
          if (sendingUser.toLowerCase().startsWith(query.toString().toLowerCase())) { 
           resultList.add(tempNotifcationList.get(i)); 
           continue; 
          } 

         } 
         for (String key : tempNotifcationList.get(i).getTag().getReceivingUsers().keySet()) { 
          receivingUsers.add(tempNotifcationList.get(i).getTag().getReceivingUsers().get(key)); 
         } 
         if (receivingUsers != null && receivingUsers.size() > 0) { 
          for (TagUser taguser : receivingUsers) { 
           Log.d(TAG, "Receiving User:" + taguser.getDisplayName()); 
           if (taguser.getDisplayName().toLowerCase().startsWith(query.toString().toLowerCase())) { 
            Log.d(TAG, "Receiving User:" + taguser.getDisplayName()); 
            resultList.add(tempNotifcationList.get(i)); 

           } 
           break; 
          } 
          continue; 

         } 
         if (message != null) { 
          if (message.toLowerCase().startsWith(query.toString().toLowerCase())) { 
           resultList.add(tempNotifcationList.get(i)); 
           continue; 
          } 

         } 
        } 
        Log.d(TAG, "Done Searching"); 

        results.values = resultList; 
        results.count = resultList.size(); 

       } 

       Log.d(TAG, "result set count:" + results.count); 
       return results; 
      } 
相關問題