0

목록보기가 내 asynctask에 있고 어댑터를 설정하고 있습니다. 자동 검색 기능을 구현해야합니다. 내 코드는 제대로 작동하지만 편집 가능한 텍스트 뷰에 텍스트를 입력하면 목록이 필터링되지 않습니다. 다음과 같이 AutoComplete Edittext가 필터링 된 목록보기 세부 정보를 표시하지 않습니다.

@Override 
protected void onPostExecute(ArrayList<RouteTrackerUser> result) 
{ 
    dialog.dismiss(); 
    if(result!=null) 
    { 
     //System.out.println("User with result===>"+result); 
     /*for(RouteTrackerUser r :result){ 
      System.out.println("Contents===>"+r.getStoreid()+" "+r.getStorename()+" "+r.getStorecode()+" "+r.getStoreno()+" "+r.getVisitcount());} 
     */ Intent intent=getIntent(); 
      TextView username=(TextView)findViewById(R.id.usrname); 
      final String sname=intent.getExtras().getString("user_name"); 
      username.setText("Welcome, "+sname); 
      userList = (ListView) findViewById(R.id.historylist); 
      userAdapter = new HistoryAdapter(History.this, R.layout.history_visits,R.id.vcount,result); 
      userList.setAdapter(userAdapter); 
      EditText inputSearch = (EditText) findViewById(R.id.autocomplete); 
      inputSearch.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
        // When user changed the Text 
        System.out.println("afafasdf"+cs); 
        History.this.userAdapter.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       
       } 
      });  
     } 

내 customAdapter은 다음과 같습니다

private static class ViewHolder { 
    public final TextView storename; 
    public final TextView storevisitcount; 

    public ViewHolder(TextView name, TextView count) { 
     this.storename = name; 
     this.storevisitcount = count; 
    } 
} 
public class HistoryAdapter extends ArrayAdapter<RouteTrackerUser> 
{ 
Context context; 
//EditText autocomplete; 
public HistoryAdapter(Context context,int resource,int textViewResourceId,ArrayList<RouteTrackerUser> result) { 
    super(context,resource,textViewResourceId, result); 
    this.context=context; 
} 

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

    TextView name; 
    TextView vcount; 
    final RouteTrackerUser User = getItem(position); 
    if (convertView == null) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     convertView = inflater.inflate(R.layout.history_visits, parent, false); 
     name = (TextView) convertView.findViewById(R.id.sname); 
     vcount = (TextView) convertView.findViewById(R.id.vcount); 
     convertView.setTag(new ViewHolder(name, vcount)); 
     convertView.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       viewdata(User.getUsername(),User.getUid(),User.getStoreid(),User.getStorename(),User.getStorecode(),User.getStoreno(),User.getVisitcount()); 
      }}); 
    } else { 
     ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 
     name = viewHolder.storename; 
     vcount = viewHolder.storevisitcount; 
    } 

    name.setText(User.getStorename()); 
    vcount.setText("Visit Count: "+User.getVisitcount()); 
    return convertView; 
} 

    } 

참고 : 내 주요 클래스 이름 History.java하고 AsyncTask를 이름 HistorySoapTask입니다.

답변

0

몇 개의 블로그와 다른 게시물을 검색 한 후 내 질문에 대한 답변을 찾았습니다. 내가 실수를 했어. 내 프로그램에서 필터 개념을 구현하지 않았어. 이제는 제대로 작동하지. 목록을 필터링하려면 다음과 같이 필터를 정의해야합니다.

private class OrderAdapterFilter extends Filter 
{ 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     constraint = constraint.toString().toLowerCase(); 
     FilterText = (String) constraint; 
     FilterResults result = new FilterResults(); 
     if(constraint != null && constraint.toString().length() > 0) 
     { 
      ArrayList<RouteTrackerUser> filt = new ArrayList<RouteTrackerUser>(); 
      ArrayList<RouteTrackerUser> lItems = new ArrayList<RouteTrackerUser>(fullitems); 
      for(int i = 0, l = lItems.size(); i < l; i++) 
      { 
       RouteTrackerUser m = lItems.get(i); 
       if(m.getStorename().toLowerCase().contains(constraint)) 
        filt.add(m); 
      } 
      result.count = filt.size(); 
      result.values = filt; 
     } 
     else 
     { 
      ArrayList<RouteTrackerUser> list = new ArrayList<RouteTrackerUser>(fullitems); 
      result.values = list; 
      result.count = list.size(); 
     } 
     return result; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     // NOTE: this function is *always* called from the UI thread. 
     filtered = (ArrayList<RouteTrackerUser>)results.values; 
     originalitems.clear(); 
     for(int i = 0, l = filtered.size(); i < l; i++) 
      originalitems.add(filtered.get(i)); 

     notifyDataSetChanged(); 
    } 
}