Android列表 - 如何找到想要的项目?

时间:2013-04-27 20:20:17

标签: android android-widget

我确实有一个可能有几千个项目的列表(仅使用约200个项目的较短列表进行测试)。信息存储在SQLite中,ContentProvider,加载器和SimpleCursorAdapter被使用。列表按字典顺序排序,并使用android:fastScrollEnabled。列表滚动顺畅 - 当知道项目的确切名称时没问题。

偶尔,我想在名称中间的某处找到包含某些子字符串的项目。 `... LIKE“%想要%”对我来说是一个解决方案。但是,我想给用户一个增量过滤 - 即在键入子字符串期间更新列表内容。原因是输入许多字符可能不是必要的,并且应该尽快找到该项目。目标不是找到一个或没有项目。目标是过滤列表,以便可以接受手动滚动来概览候选项目,并通过触摸选择其中一项。

我遇到了SearchView小部件,它非常适合操作栏。无论如何,在文档中阅读更多关于它的内容,我不确定它是否适合我。或者,如果建议的实施是我的。 (我是一个Android初学者,我甚至不确定我是否理解它。)

是否可以使用窗口小部件在Action Bar中具有SearchView的同一活动中对列表进行增量过滤?你能指点一些可能显示如何实现所需行为的代码吗?

1 个答案:

答案 0 :(得分: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());
      }
     });
   }   
}