1

我們有一個列表視圖片段,其中包含一個列表視圖,編輯文本(用於搜索)和複選框(全選)。如前所述,我們使用編輯文本從列表視圖中搜索值。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 – 2014-09-19 04:34:23

回答

1

當你鍵入我們顯示有兩個值,即WF和WH編輯文字「W」。選擇WF(顯示第一項)。

但是您已經爲列表視圖的第一行執行了操作,現在選中了列表視圖的複選框,並且在清除編輯文本中的字符時,您將看到第一個框被選中的列表視圖的完整列表。哪個是對的。

如果您想避免此問題,請創建自定義適配器並覆蓋getfilter方法。否則,創建您自己的邏輯並調用listView.setItemChecked(存儲的位置,true/false);否則,創建您自己的邏輯並調用listView.setItemChecked(存儲位置,true/false);否則,創建您自己的邏輯並調用listView.setItemChecked(存儲位置,true/false)。在ontextchanged中。

+0

謝謝哈薩Vardhan的建議。我試圖寫我自己的邏輯來實現這個目標,就像你最後說的那樣。我有更新後會回來。 – PramodK 2014-09-19 12:59:21