2013-04-27 6 views
0

나는 아마도 수천 개의 아이템 목록을 가지고있다. (단지 약 200 개의 아이템으로 짧은리스트로 테스트한다.) 이 정보는 SQLite에 저장되며 ContentProvider 로더와 SimpleCursorAdapter이 사용됩니다. 목록은 사전 식으로 정렬되며 android:fastScrollEnabled이 사용됩니다. 목록은 매끄럽게 스크롤됩니다. 항목의 정확한 이름을 아는 것은 문제가되지 않습니다.Android 목록 - 원하는 항목을 찾는 방법은 무엇입니까?

가끔은 일부 하위 문자열이 이름의 중간에있는 항목을 찾고 싶습니다. `... % like wanted % '는 나를위한 해결책입니다. 그러나 사용자에게 점진적 필터링을 제공하고자합니다. 즉, 하위 문자열을 입력하는 동안 목록 콘텐츠가 업데이트됩니다. 그 이유는 많은 문자를 타이핑 할 필요가 없기 때문에 가능한 빨리 항목을 찾아야한다는 것입니다. 목표는 하나 또는 하나도없는 항목을 찾는 것이 아닙니다. 목표는 수동 스크롤을 통해 후보 항목을 검토하고 터치하여 그 중 하나를 선택할 수 있도록 목록을 필터링하는 것입니다.

나는 작업 표시 줄에서 멋지게 보이는 SearchView 위젯을 만났습니다. 어쨌든, 문서에서 그것에 대해 더 많은 것을 읽는다면, 그것이 나를위한 올바른 도구인지 확실하지 않습니다. 또는 권장 구현이 저에게 적합한 경우. (나는 안드로이드 초보자이다. 잘 이해하면 잘 모르겠다.)

액션 바의 SearchView와 동일한 활동에서 목록의 증분 필터링에 위젯을 사용할 수 있습니까? 당신이 원하는 행동을 구현하는 방법을 보여줄 수있는 코드를 가르쳐 주시겠습니까?

+0

이 링크 ... http://stackoverflow.com/questions/14038331/android-searchview-filter-listview –

+0

@AbhishekSabbarwal을보십시오. OnQueryTextListener ...에 대한 간단한 답변을 작성하십시오. 동의하겠습니다. – pepr

답변

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

관련 문제