2011-08-09 2 views
3

다음 코드는 검색 EditText에있는 문자를 입력 할 때 listview에서 0 뷰를 반환합니다. 다음 방법이 내 어댑터 클래스입니다문자열 ArrayAdapter에 의해 지원되는 ListView에서 TextWatcher를 사용하여 필터링하면 빈 결과가 반환됩니다.

private void setupList() { 
    final ListView lv = (ListView) findViewById(R.id.contactList); 
    ArrayAdapter<Info> la = new MyListAdapter(this, mInfoList); 
    lv.setAdapter(la); 
    lv.setTextFilterEnabled(true); 
    EditText edit = (EditText) findViewById(R.id.searchbar); 
    edit.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 

     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { 

     } 

     @Override 
     public void afterTextChanged(Editable text) { 
      Log.d("search", ""+text); 
      ArrayAdapter<Info> la = (ArrayAdapter<Info>) lv.getAdapter(); 
      la.getFilter().filter(text); 
      la.notifyDataSetChanged(); 
     } 
    }); 
} 

activty 클래스에서입니다

public class MyListAdapter extends ArrayAdapter<Info> { 
private Bitmap mDefaultProfilePic = null; 
Context mContext = null; 

public MyListAdapter(Context ctxt, ArrayList<Info> mFriendsAccounts) { 
    super(ctxt, R.id.name, mFriendsAccounts); 
    mContext = ctxt; 

    mDefaultProfilePic = BitmapFactory.decodeResource(ctxt.getResources(), R.drawable.face); 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     LayoutInflater inf = (LayoutInflater) mContext.getSystemService(Service.LAYOUT_INFLATER_SERVICE); 
     convertView = inf.inflate(R.layout.layout_list_view, null); 
    } 
    Info usr = getItem(position); 
    ((TextView)convertView.findViewById(R.id.name)).setText(usr.Name); 
    ((ImageView)convertView.findViewById(R.id.invite)).setTag(position); 

    if (mImageBitmaps.get(position) != null) { 
     ((ImageView)convertView.findViewById(R.id.profilePic)).setImageBitmap(mImageBitmaps.get(position)); 
    } else { 
     ((ImageView)convertView.findViewById(R.id.profilePic)).setImageBitmap(mDefaultProfilePic); 
    } 

    return convertView; 
} 

} 
+0

getAdapter가 반환하는 코드를 디버깅하여 코드를 단계적으로 살펴 보았습니까? – Jack

답변

4

마지막으로 문제가 해결되었습니다. Info 개체에서 toString() 메서드를 재정의해야했습니다. 내 경우 필터링은 name 필드를 기반으로하므로 toString()을 통해 반환됩니다.
필터링 프로세스에서 어댑터의 각 개체에 대해 toString()을 호출합니다.

+0

userSeven7s 동일한 문제가 있지만 문제를 표시 할 수 없습니다. 조금 노골적으로 표현해 주실 수 있습니까? Thx – Lasecun

+0

여기에 질문을 올리셨습니까? 링크를주십시오. 필자의 경우, toString 메소드를 오버라이드하여 정보 객체 데이터를 문자열 형태로 반환한다. – Ronnie

+0

Here - http://stackoverflow.com/questions/12476645/filter-listview-i-cant-understand-filter-rule – Lasecun

1

Here는 말한다 :

반환 어댑터가 는, setAdapter에 전달 된 동일한 어댑터하지 않을 수 있습니다 (ListAdapter). 그러나 WrapperListAdapter 일 수도 있습니다.

문제가 무엇인가요?

+0

아니요. 어댑터를 보유하기 위해 회원을 추가했지만 문제를 해결하지 못했습니다. – Ronnie

+0

디버깅을하고 코드를 단계별로 실행하여 정확한 결과를 확인 했습니까? – Jack

+0

예. 목록보기는 모든보기를 얻는 것입니다 (필터링 된 것 대신에) 어댑터에서 키를 누를 때 .. 그러나 목록보기에 표시하지 않습니다. 그것은 필터가 문제라는 것을 의미합니까? – Ronnie

관련 문제