2013-04-27 51 views
0

我確實有一個可能有幾千個項目的列表(只需要用較短的列表測試大約200個項目)。信息存儲在SQLite中,使用ContentProvider,loader和SimpleCursorAdapter。該列表按照字典順序排序,並使用android:fastScrollEnabled。該列表順利滾動 - 當知道該項目的確切名稱時沒有問題。Android列表 - 如何找到想要的項目?

偶爾,我想找到某個地方包含一些子在他們的名字中間的項目。 '... LIKE「%wanted%」是我的一個解決方案。但是,我想給用戶一個增量過濾 - 即在鍵入子串期間更新列表內容。原因是可能不需要鍵入多個字符,並且應該儘快找到該項目。目標不是找到一個或沒有項目。我們的目標是過濾列表,以便手動滾動是可以接受的概述候選項目,並通過觸摸屏選擇其中之一。

我已經滿足了SearchView小部件,看起來很好,在操作欄。無論如何,在文檔中閱讀更多關於它的內容,我不確定它是否適合我。或者,如果推薦的實施是我的一個。 (我是一名Android初學者,我甚至不確定自己是否理解得很好。)

是否可以使用該小部件在與操作欄中的SearchView相同的活動中對列表進行增量過濾?你能指點我一些可能展示如何實現想要的行爲的代碼嗎?

+0

試試這個鏈接... http://stackoverflow.com/questions/14038331/android-searchview-filter-listview – 2013-04-27 20:28:57

+0

@AbhishekSabbarwal:謝謝。請在OnQueryTextListener上制定簡短的答案......我會接受它。 – pepr 2013-04-28 11:32:44

回答

1

示例代碼嘗試:

public class AndroidListViewFilterActivity extends Activity { 

    ArrayAdapter<String> dataAdapter = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //Generate list View from ArrayList 
     displayListView(); 

    } 

    private void displayListView() { 

     //Array list of countries 
     List<String> countryList = new ArrayList<String>(); 
     countryList.add("Aruba"); 
     countryList.add("Anguilla"); 
     countryList.add("Netherlands Antilles"); 
     countryList.add("Antigua and Barbuda"); 
     countryList.add("Bahamas"); 
     countryList.add("Belize"); 
     countryList.add("Bermuda"); 
     countryList.add("Barbados"); 
     countryList.add("Canada"); 
     countryList.add("Costa Rica"); 
     countryList.add("Cuba"); 
     countryList.add("Cayman Islands"); 
     countryList.add("Dominica"); 
     countryList.add("Dominican Republic"); 
     countryList.add("Guadeloupe"); 
     countryList.add("Grenada"); 

     //create an ArrayAdaptar from the String Array 
     dataAdapter = new ArrayAdapter<String>(this,R.layout.country_list, countryList); 
     ListView listView = (ListView) findViewById(R.id.listView1); 
     // Assign adapter to ListView 
     listView.setAdapter(dataAdapter); 

     //enables filtering for the contents of the given ListView 
     listView.setTextFilterEnabled(true); 

     listView.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
     // When clicked, show a toast with the TextView text 
      Toast.makeText(getApplicationContext(),((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

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

     public void afterTextChanged(Editable s) { 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      dataAdapter.getFilter().filter(s.toString()); 
     } 
    }); 
    } 
} 
+0

謝謝。我已經瞭解到,適配器必須過濾,這也適用於'SimpleCursorAdapter',我使用。使用選擇條件而不是使用'.filter'來簡化「.restartLoader」會不會更容易? – pepr 2013-04-30 09:50:02

相關問題