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