2013-05-13 4 views
2

Я пытаюсь выяснить, как я могу применить mutiple фильтр (TextBox и другое поле) к списку.Больше чем одно поле фильтра для ListViews

Прямо сейчас, я фильтрую текстовым полем, но я хочу добавить checkbok и строки фильтра, если у них есть поле с истинным или ложным значением. Таким образом, я мог применять оба фильтра одновременно.

Прямо сейчас, что я получил это это:

public class ListUsersDialog extends AbstractDialog { 

    //TODO 
    private Button okButton; 
    private Button cancelButton; 

    private ListView lv;  
    //private ArrayAdapter<String> adapter; 
    private ArrayAdapter<UserResponse> adapter; 
    private EditText inputSearch; 
    private EditText inputSearch2; 
    private String room; 
    //private String users[] = {}; 
    private UserResponse users[] = {}; 



    public ListUsersDialog() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public ListUsersDialog(String room) { 
     this.room = room; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.dialog_list_users, container); 

     //Se consulta por la lista de los usuarios, los parametros que se pasan es por si se quiere customizar el resultado en el futuro. 
     AsyncGUI asyncDialogs = new AsyncGUI(this); 
     asyncDialogs.execute(new RequestMessage(ConstantsRooms.GET_USERS, room , ((AbstractActivity)getActivity()).getUserName()));  
     getDialog().setTitle("Invitar a usuarios"); 

     // Listview Data  
     lv = (ListView) view.findViewById(R.id.list_view_users); 
     inputSearch = (EditText) view.findViewById(R.id.inputSearch); 

     // Adding items to listview   
     //adapter = new ArrayAdapter<String>(this.getActivity(), R.layout.list_item_user, R.id.userNameSendInvitation, users); 
     adapter = new ArrayAdapter<UserResponse>(this.getActivity(), R.layout.list_item_user, R.id.userNameSendInvitation, users); 
     lv.setAdapter(adapter);   

     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

       // selected item 
       String userToSendMessage = (String)parent.getAdapter().getItem(position);    
       //Se hace una llamada a GCM con el usuario que crea la partida y a quien va dirigida la invitacion 

       AsyncGUI async = new AsyncGUI(ListUsersDialog.this); 
       async.execute(new RequestMessage(ConstantsRooms.SEND_GCM_MESSAGE_INVITATION, 
               ((AbstractActivity)getActivity()).getUserName(), 
               room, 
               userToSendMessage)); 

      } 
      }); 

     //Filter. 
     inputSearch.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {     
       ListUsersDialog.this.adapter.getFilter().filter(cs); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
        int arg3) { 
      } 

      @Override 
      public void afterTextChanged(Editable arg0) { 
      } 
    }); 

}

Я думаю, это самый типичный код, я не знаю, если кто-то может дать мне некоторые подсказки, чтобы делать то, что я м пытается.

Это мой адаптер:

public class CustomUsersAdapter extends ArrayAdapter<UserResponse> { 

    private List<UserResponse> usersList; 
    private Context context; 

    public CustomUsersAdapter(List<UserResponse> usersList, Context ctx) { 
     super(ctx, R.layout.list_item_user, usersList); 
     this.usersList = usersList; 
     this.context = ctx; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 

     // First let's verify the convertView is not null 
     if (convertView == null) { 
      // This a new view we inflate the new layout 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.list_item_user, parent, 
        false); 
     } 
     // Now we can fill the layout with the right values 
     TextView name = (TextView) convertView 
       .findViewById(R.id.txt_userNameSendInvitation); 
     TextView isFriend = (TextView) convertView 
       .findViewById(R.id.txt_friend); 
     UserResponse user = usersList.get(position); 

     name.setText(user.getUserName()); 
     isFriend.setText("Friend:" + user.isbFriend()); 

     return convertView; 
    } 

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

    public UserResponse getItem(int position) { 
     return usersList.get(position); 
    } 

    public long getItemId(int position) { 
     return usersList.get(position).hashCode(); 
    } 

} 

Даже, если создать фильтр в моем адаптере, я не могу понять, как я фильтр для двух разных областей, потому что мне нужно два фильтра классы, и я думаю, что это невозможно ... или не так ли?

РЕШЕНИЕ: How to apply multiple Filters on an Adapter?

ответ

0

Вы должны быть в состоянии сделать это, добавив функцию setFilterQueryProvider на адаптере: http://developer.android.com/reference/android/widget/CursorAdapter.html#setFilterQueryProvider(android.widget.FilterQueryProvider)

Эта функция будет срабатывать каждый раз, когда ваш addTextChangedListener будет называться. Поэтому вы можете настроить несколько прослушивателей на нескольких полях.

Вам нужно добавить этот код для адаптера и его реализации:

mAdapter.setFilterQueryProvider(new FilterQueryProvider() { 
     public Cursor runQuery(CharSequence constraint) {   
      //return here your updated cursor 
     } 
    }); 

PS: Я использую это на ListView с 5 различными фильтрами

+0

Я нуб с Android, я используя класс, который он расширяет ArrayAdapter прямо сейчас. Я не получаю данные из базы данных, и я думаю, что CursorAdapter для этого. Я видел, что могу разработать свой собственный фильтр в своем адаптере, но это будет только одно поле. – Guille

+0

Решение http://stackoverflow.com/questions/11390890/how-to-apply-multiple-filters-on-an-adapter – Guille

Смежные вопросы