1

У нас есть фрагмент списка, содержащий список, текст редактирования (для поиска) и флажок (Выбрать все). Как уже упоминалось, мы используем Edit Text для поиска значений из списка.Фильтр поиска в ListView не работает как ожидается

Проблема:

  1. Мы имеем представление списка отображающее 10 пунктов (в виде списка сортируются в алфавитном порядке).
  2. Когда мы вводим «W» в текст редактирования, мы показываем два значения, то есть WF и WH.
  3. Выбор сделан для WF (отображается первый элемент).
  4. После очистки символов в тексте редактирования мы теперь отображаются с полным списком вида списка.
  5. Но выбор теперь сделан для первого элемента в списке AHMD. (мы намеревались выбрать WF)

В принципе, позиции данных в представлении списка не обновляются после того, как мы выполнили поиск.

код:

public static class ListViewFragment extends Fragment { 

    private ListView myListView; 
    private EditText editsearch; 
    private CheckBox selectAll; 
    private String SELECTED_FILTER; 
    private ArrayList<String> SelectedFilter1; 
    private ArrayList<String> checkekprev=new ArrayList<String>(); 
    private ArrayList<String> CheckedFitlers=new ArrayList<String>(); 

    ArrayAdapter<String> adapter_list; 

    OnCheckedItemsLister onCheckedItemsLister;  

    public ListViewFragment() { 
     // Empty constructor required for fragment subclasses 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
      try { 
       onCheckedItemsLister = (OnCheckedItemsLister) activity; 
      } catch (ClassCastException e) { 
       throw new ClassCastException(activity.toString() + " must implement onSomeEventListener"); 
      } 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setRetainInstance(true); 
     SelectedFilter1=getArguments().getStringArrayList("ArrayList"); 
     SELECTED_FILTER=getArguments().getString("SELECTED_FILTER"); 
     checkekprev=getArguments().getStringArrayList("checkedprevlist"); 




     if(checkekprev.size()==SelectedFilter1.size()) 
      selectAll.setChecked(true); 
      else 
      selectAll.setChecked(false); 

     adapter_list = new ArrayAdapter<String>(this.getActivity(), 
       android.R.layout.simple_list_item_multiple_choice,SelectedFilter1); 

     adapter_list.notifyDataSetChanged(); 

     myListView.setAdapter(adapter_list); 

     myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

     myListView.setTextFilterEnabled(true); 

     try{ 
      if(checkekprev.isEmpty()==false){ 
       Log.i("Adapter set", "Yes"); 
       for(int j=0;j<checkekprev.size();j++){ 
        Log.i("Adapter set", "Yes:"+j); 
       int pos=adapter_list.getPosition(checkekprev.get(j)); 
       Log.i("Adapter set", "Pos:"+pos); 
       myListView.setItemChecked(pos,true); 
       } 

      }   
     }catch(NullPointerException e){ 
      Log.i("Null set", "Yes"); 
     } 

     editsearch.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void afterTextChanged(Editable arg0) { 
       // TODO Auto-generated method stub 
       String text = editsearch.getText().toString().toLowerCase(Locale.getDefault()); 
       adapter_list.getFilter().filter(text); 
      } 

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

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

     selectAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 

       Log.i("CheckBOX","Is Checked:"+isChecked); 
       if(isChecked) 
       { 
        for (int i=0; i< myListView.getCount(); i++) 
         myListView.setItemChecked(i, true); 

       }else 
       { 
        for (int i=0; i< myListView.getCount(); i++) 
         myListView.setItemChecked(i, false); 
       } 
       SparseBooleanArray checked = myListView.getCheckedItemPositions(); 
       CheckedFitlers.clear(); 
       for(int i=0;i<=checked.size();i++){ 
        if (checked.get(i)){ 
         CheckedFitlers.add(SelectedFilter1.get(i)); 
        } 
       } 
       onCheckedItemsLister.someEvent(CheckedFitlers,SELECTED_FILTER); 
      } 
     } 
    ); 

     myListView.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view,int position, long id){ 
       setItemChecked(position); 
       onCheckedItemsLister.someEvent(CheckedFitlers,SELECTED_FILTER); 

      }    
     }); 

    } 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     if(savedInstanceState!=null){ 
      checkekprev=savedInstanceState.getStringArrayList("Checked_Values"); 
     } 
    } 

    public void setItemChecked(int position){ 

     //if(SelectedFilter1.get(position).) 

      //int len = myListView.getCount(); 
      SparseBooleanArray checked = myListView.getCheckedItemPositions(); 

      for(int i=0;i<=checked.size();i++){ 
       Log.i("Check Sparse Array","Check Sparse Array: "+checked.get(i)); 
      } 

      //for (int i = 0; i < len; i++){ 
       Log.i("SelectedFilter1.get(position)","SelectedFilter1.get(position):::"+SelectedFilter1.get(position)); 

       Log.i("checked.get(position))","checked.get(position)):::"+checked.get(position)); 

       for (int i=0; i<CheckedFitlers.size();i++){ 
        Log.i("CheckedFitlers","CheckedFitlers:::" + CheckedFitlers.get(i)); 
       } 
       for (int i=0; i<checkekprev.size();i++){ 
        Log.i("checkekprev","checkekprev:::" + checkekprev.get(i)); 
       } 
       Log.i("CheckedFitlers","CheckedFitlers:::" + CheckedFitlers.size()); 
       Log.i("checkekprev","checkekprev:::" + checkekprev.size()); 

       if(CheckedFitlers.size() == 0 && checkekprev.size() != 0){ 
        CheckedFitlers = checkekprev; 
       } 

       Log.i("CheckedFitlers","CheckedFitlers:::" + CheckedFitlers.size()); 

       if (checked.get(position)) { 
        Log.i("Adding","Adding::"+checked.get(position)); 

        CheckedFitlers.add(SelectedFilter1.get(position)); 
       for(int i=0;i<checkekprev.size();i++){ 
         //Log.i("Checked Filters FOr loop","Checked Filters:"+CheckedFitlers.get(i)); 
        } 
       } else 
       { 
       Log.i("Removing","Removing::"+checked.get(position)+":"+SelectedFilter1.get(position)); 
       CheckedFitlers.remove(SelectedFilter1.get(position)); 
        for(int i=0;i<checkekprev.size();i++){ 
         //Log.i("Checked Filters for loop","Checked Filters:"+CheckedFitlers.get(i)); 
        } 
       } 
       Log.i("CheckedFitlers","CheckedFitlers:::" + CheckedFitlers.size()); 

    } 

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

     View rootView = inflater.inflate(R.layout.fragment_list_view, container, false); 

     myListView=(ListView) rootView.findViewById(R.id.listView_brand); 

     editsearch = (EditText) rootView.findViewById(R.id.search); 

     selectAll=(CheckBox) rootView.findViewById(R.id.checkBox1); 

     selectAll.setFocusable(false); 

     return rootView; 
    } 

    public void onSaveInstanceState(Bundle savedInstanceState){ 
     super.onSaveInstanceState(savedInstanceState); 

     Log.i("savedInstanceState in listfragment","savedInstanceState in listfragment"); 
     //onCheckedItemsLister.someEvent(CheckedFitlers,SELECTED_FILTER); 
     onCheckedItemsLister.getSelectedFilter(SELECTED_FILTER); 

    } 

} 
+0

Проверка: http://stackoverflow.com/questions/25844210/how-to-select-multiple-items-in-a-listview-populated-from-arraylist-in-android/25844671#25844671 –

ответ

1

Когда вы набрали «W» в тексте редактирования мы отображаются с двумя значениями, т.е. WF и WH. Выбор сделан для WF (отображается первый элемент).

Но вы выполнили действие для первой строки списка, теперь отмечен флажок listview и при очистке символов в тексте редактирования вы видите полный список списка с первым отмеченным флажком. что правильно.

Если вы хотите избежать этих проблем, создайте пользовательский адаптер и переопределите метод getfilter.

В противном случае создайте свою собственную логику и вызовите listView.setItemChecked (сохраненные позиции, true/false); в ontextchanged.

+0

Спасибо Харша Вардхан за предложения. Я пытаюсь написать свою собственную логику, чтобы реализовать это, как было указано вами в конце. Вернусь, как только у меня будет обновление. – PramodK