2013-05-30 2 views
1

SimpleCursorAdapter를 사용하는 ListView에 대한 필터를 구현하는 방법에 대한 문제가 한 명 이상있었습니다. 나는이 문제가 있었고 나는이 웹에서 이것에 대해 많은 답을 발견했다. 마침내 작동하게 될 때까지 모든 부분에서 코드 조각을 가져 왔고 모양이 더 간단했습니다.편집 텍스트 및 SimpleCursor 어댑터를 사용하여 ListView를 필터링하는 방법?

나는 구글 I/O 2010 본 적이 - YouTube에서의 ListView 비디오의 세계를 그리고 당신이 getFilter 메소드를 구현해야하고, 클래스 어댑터에서이 같은 필터링 구현하는 것을 말한다

public class MyListCursorAdapter extends SimpleCursorAdapter implements Filterable{ 

... 
@Override 
public Filter getFilter() { 
    return new Filter(){ 
     @Override 
     protected FilterResults performFiltering(CharSequence charSequence){ 
      FilterResults results = new FilterResults(); 

      //If there's nothing to filter on, return the original data for your list 
      if(charSequence == null || charSequence.length() == 0){ 
       results.values = originalData; 
       results.count = originalData.getCount(); 
      } 
      else{ 

       Cursor filterResultsData = null; 

       filterResultsData = DB.getResults(charSequence); 

       results.values = filterResultsData; 
       results.count = filterResultsData.getCount(); 
      } 

      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence charSequence, FilterResults filterResults){ 
      filteredData = (Cursor) filterResults.values; 
      if (filterResults.count > 0) { 
       notifyDataSetChanged(); 
      }else{ 
       notifyDataSetInvalidated(); 
      } 
     } 
    }; 
} 
} 

적어도 내가하려고 한 것입니다. Cursor 대신 ArrayAdapter를 사용하면 꽤 잘 작동한다는 것을 알 수 있습니다. 그러나 Cursor의 경우에는 적어도 저에게는 적합하지 않았습니다. 어쩌면 내가 뭔가 잘못하고있는 것 같아. 그래서 나는 조금 혼란스러워했다. 편집 텍스트, 목록보기 및 매번 편집 텍스트에 텍스트를 넣으면 내 목록이 필터링되기를 원합니다.

이제 내 해결책을 함께 나누기 위해 내 자신의 질문에 답변 할 것입니다.

답변

1

이 내가했던 무엇인가

레이아웃 : 안드로이드에

<EditText 
    android:id="@+id/editTextSearch" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:inputType="text" 
    android:hint="@string/search" > 
</EditText> 


<ListView 
    android:id="@id/android:list" 
    android:textFilterEnabled="true" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
</ListView> 

에주의 : textFilterEnabled = "true"를 ListView에있다.

내 ListActivity 또는 ListFragment :

public class ClientesActivity extends ListFragment { 

private MyListCursorAdapter myAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.activity_clientes, container, false); 

      //call to a method that fill my list 
    myListGetFilled(view); 

      //Put a listener to edit text search 
    EditText etSearch = (EditText) view.findViewById(R.id.editTextSearch); 
    etSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      myAdapter.getFilter().filter(cs); 

     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub       
     } 
    }); 


    return view; 
} 

    private void myListGetFilled(View view){ 

    Cursor mCursor = DB.fillMyList(getActivity()); 

    if(mCursor.getCount()>0){ 

     String[] from = new String[] { "name", "description"}; 
     int[] to = new int[] { R.id.textViewName, R.id.textViewDescription}; 

     ListView myListView = (ListView) view.findViewById (android.R.id.list); 

     myAdapter = new MyListCursorAdapter(context, R.layout.activity_row_list, mCursor, from, to); 
     myListView .setAdapter(myAdapter); 

    } 
} 

그리고 마지막으로 내 사용자 정의 커서 어댑터 :

public class MyListCursorAdapter extends SimpleCursorAdapter implements Filterable{ 

    ... 

    /*THE METHOD THAT DOES THE MAGIC*/ 
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 

    if (getFilterQueryProvider() != null){ 
     return getFilterQueryProvider().runQuery(constraint); 
    } 

    Cursor filterResultsData = DB.getResults(constraint); 
    return filterResultsData; 
    } 
} 

그리고 그것입니다!.

희망은 누구에게나 유용 할 수 있습니다. 그리고 이보다 더 나은 해결책이 있다고 생각한다면 공유하십시오 !!

관련 문제