2014-06-10 19 views
0

我有一個很長的列表視圖,所以我試圖添加一個搜索欄,所以我不必滾動瀏覽列表視圖來找到我想要的。它似乎過濾掉了它想要的東西,關於我在做什麼錯誤的任何線索?添加搜索列表視圖的能力

這裏的名單:

public class ExList { 

private List<Example> listExample = new ArrayList<Example>(); 

public void populateThingsList(){ 
     listExample.add(new Example("asdf name", 1, "Example detail 1", "Example detail 2", R.drawable.1_icon, "Example detail 3")); 
     listExample.add(new Example("ghkj name", 2, "Example detail 1", "Example detail 2", R.drawable.2_icon, "Example detail 3")); 
     listExample.add(new Example("astg name", 3, "Example detail 1", "Example detail 2", R.drawable.3_icon, "Example detail 3")); 
     listExample.add(new Example("ghky name", 4, "Example detail 1", "Example detail 2", R.drawable.4_icon, "Example detail 3")); 
     listExample.add(new Example("ghee name", 5, "Example detail 1", "Example detail 2", R.drawable.5_icon, "Example detail 3")); 
     listExample.add(new Example("asre name", 6, "Example detail 1", "Example detail 2", R.drawable.6_icon, "Example detail 3")); 
     listExample.add(new Example("yuoi name6", 7, "Example detail 1", "Example detail 2", R.drawable.7_icon, "Example detail 3")); 
     listExample.add(new Example("oiuy name", 8, "Example detail 1", "Example detail 2", R.drawable.8_icon, "Example detail 3")); 
     listExample.add(new Example("fdsa name", 9, "Example detail 1", "Example detail 2", R.drawable.9_icon, "Example detail 3")); 
     listExample.add(new Example("lkjh name", 10, "Example detail 1", "Example detail 2", R.drawable.10_icon, "Example detail 3")); 
} 

,我寫了搜索的方法:

public void filter(String search) { 
     Example ex; 
     String s = search.trim().toLowerCase(); 
     String t; 

     for (int i = 0; i < listExample.size(); i++) { 
      ex = listExample.get(i); 
      t = ex.getName().trim().toLowerCase(); 
      if (!t.contains(s)){ 
       listExample.remove(ex); 
      } 
     } 

    } 

和當獲取的文本改變

searchText = (EditText) findViewById(R.id.txt_search); 
     searchText.addTextChangedListener(new TextWatcher(){ 

     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
      if (!searchText.getText().toString().trim().isEmpty()){ 
       listExample = exList.getListExample(); 
       exList.filter(searchText.getText().toString()); 
       populateListView(); 
      } 
      if (searchText.getText().toString().trim().isEmpty()){ 
       listExample = exList.getListExample(); 
       populateListView(); 
       //this resets the listview and actually works 
      } 


     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 
    }); 

我arrayadapter代碼類和populatelistview方法

private void populateListView() { 
     ArrayAdapter<Example> adapter = new MyListAdapter(); 
     ListView list = (ListView) findViewById(R.id.exampleListView); 
     list.setAdapter(adapter); 
    } 

private class MyListAdapter extends ArrayAdapter<Example> { 
     public MyListAdapter() { 
      super(MainActivity.this, R.layout.item_view, listExample); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View itemView = convertView; 
      if (itemView == null) { 
       itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false); 
      } 
      Example currentExample = listExample.get(position); 

      ImageView imageView = (ImageView)itemView.findViewById(R.id.item_image); 
      imageView.setImageResource(currentExample.getIconId()); 

      TextView detailThreeText = (TextView) itemView.findViewById(R.id.item_txtDThree); 
      detailThreeText.setText(currentExample.getDThree()); 

      TextView detailTwoText = (TextView) itemView.findViewById(R.id.item_txtDTwo); 
      detailTwoText.setText(currentExample.getDTwo()); 

      TextView detailOneText = (TextView) itemView.findViewById(R.id.item_txtDOne); 
      detailOneText.setText(currentExample.getDOne()); 

      TextView nameText = (TextView) itemView.findViewById(R.id.item_txtName); 
      nameText.setText(currentExample.getName()); 



      return itemView; 
     } 
+0

你是什麼意思:它似乎篩選出它想要哪個? –

+0

會自動完成listView在你的情況有幫助嗎? –

+0

我不想讓搜索欄自動完成。 – user3682017

回答

2

我試着在這裏寫一些通用代碼,修改它並讓我知道。不要使用單獨的功能進行比較,在內部做onTextChanged

searchText.addTextChangedListener(new TextWatcher() { 

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

        String searchString = searchText.getText().toString(); 
        int textLength = searchString.length(); 

        ArrayList<String> searchList = new ArrayList<String>; 
        //searchList.clear(); 

        for (int i = 0; i < listExample.size(); i++) { 
         Example model = listExample.get(i); 
         String Names = model.getName().toString(); 
         if (textLength <= Names.length()) { 
          // compare the String in EditText with Names in the 
          // ArrayList 
          if (searchString.equalsIgnoreCase(Names.substring(
            0, textLength))) 
           searchList.add(listExample.get(i)); 
         } 
        } 

        ArrayAdapter<Example> ad = new YOUR_ADAPTER(
          YOUR_CLASS.this, searchList); 
        YOUR_LISTVIEW.setAdapter(ad); 
       } 

       @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 

       } 
      }); 
+0

searchList.add(listExample.get(i));不起作用,因爲searchlist是一個字符串的ArrayList,我不僅僅需要在我的listview中使用字符串。儘管如此,如果我發佈我的數組適配器,可以幫助你多一點嗎? – user3682017

+0

是啊,我只會當你要接受和高達投票如果我的回答可以幫助你:d – Aniruddha

+0

嘗試改變'ArrayList的 searchList =新的ArrayList ;''到列表 searchList =新的ArrayList ;' – Aniruddha

1

嚴肅地說,你做錯了什麼。找出問題的最快方法是調試應用程序,並通過斷點逐步完成。在每個斷點處檢查重要值的值。在某個時候,你會發現你的假設是不正確的。例如,您會發現比較操作無法正常工作。

相信我,這是解決問題的最快方法。我們這裏的其他人可能會在幾個小時內閱讀您的代碼,試圖找到該錯誤,但通過調試,您可能會在幾分鐘內找到問題。