2017-01-04 4 views
2

잘 작동하는 searchview를 사용하여 listview를 필터링 할 수 있습니다. 내 listview는 어댑터를 업데이트하는 데 사용되는 매 초마다 업데이트됩니다. 난리스트 뷰 여과 searchview되는 문자열을 입력하면되지만필터링 된 listview가 매 초마다 업데이트되는 어댑터로 유지되지 않습니다.

private void nonstoprun() { 

    handler = new Handler(); 
    update = new Runnable() { 
     @Override 
     public void run() { 

      musers = (ArrayList<mobstat>) mobstat.listAll(mobstat.class); 
      descAdapter = new DescAdapter(seconds.this, musers, seconds.this); 
      contlist.setAdapter(descAdapter);// Notify our update 
      handler.postDelayed(this , 1000); 
      // android.widget.Filter filter = descAdapter.getFilter(); 
      //filter.filter(searchView.getQuery()); 


     } 
    }; 
    handler.postDelayed(update, 10); 

} 

그래서, 바로 그것이 필터링 된 값을 유지되지 않는 완전한리스트 뷰를 나타낸다.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu, menu); 
    searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search)); 

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      android.widget.Filter filter = descAdapter.getFilter(); 
      filter.filter(newText); 
      return true; 
     } 

    }); 
    //searchView.setSubmitButtonEnabled(true); 
    return true; 

} 

Myadapter :

public class DescAdapter extends BaseAdapter implements Filterable { 

private seconds ds; 
private ArrayList<mobstat> musers; 
private ArrayList<mobstat> mOrig; 
Activity seconds; 

public DescAdapter(seconds ds, ArrayList<mobstat> musers, Activity seconds) { 
    this.ds = ds; 
    this.musers = musers; 
    this.seconds = seconds; 

} 


@Override 
public int getCount() { 

    return musers.size(); 
} 

@Override 
public Object getItem(int i) { 
    return musers.get(i); 
} 

@Override 
public long getItemId(int i) { 
    return i; 
} 

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 

    mobstat du = musers.get(i); 
    String name = du.name; 
    String status = du.status; 


    Viewholder viewholder; 
    if(view==null) { 
     viewholder = new Viewholder(); 
     view = LayoutInflater.from(ds).inflate(R.layout.custom, null); 
     viewholder.uname = (TextView) view.findViewById(R.id.name); 
     viewholder.ustatus = (TextView) view.findViewById(R.id.status); 
     view.setTag(viewholder); 
    } else { viewholder = (Viewholder) view.getTag(); } 
    viewholder.uname.setText(name); 
    viewholder.ustatus.setText(status); 


    return view; 
} 

@Override 
public Filter getFilter() { 
    return new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      final FilterResults oReturn = new FilterResults(); 
      final ArrayList<mobstat> results = new ArrayList<mobstat>(); 

      if (mOrig == null) 
       mOrig=musers; 
      if(constraint!=null){ 
       if(mOrig!=null && mOrig.size()>0){ 
        for(final mobstat g : mOrig){ 
         if (g.getname().toLowerCase().contains(constraint.toString())){ 
          results.add(g);} 
        } 
       } 
       oReturn.values=results; 
      } 
      return oReturn; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

      musers= (ArrayList<mobstat>) results.values; 
      notifyDataSetChanged(); 
     } 
    }; 
} 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
} 
} 

필터링 된 목록도 - 비록 어댑터 값은 모든 초를 업데이트 유지되지 않는 이유.

+0

을 (여과 당신은 아마도 UI의 결함을 얻을 것이다)는 건설 기능 매초마다 새로운 어댑터. 새 어댑터는 필터가 적용된 이전 어댑터를 대체합니다. Btw 왜 매초마다 새로운 어댑터를 만들어야합니까? –

+0

서버에서 수정 된 값을 가져와 최근 값을 표시하기 위해 어댑터에서 업데이트해야합니다. – user2269164

답변

0

서버에서 값을 업데이트 할 필요가 있습니다. 매개 변수로 쿼리 문자열을 전달하는 어댑터의 새 생성자를 작성할 수 있습니다 (비어 있지 않은 경우). 생성자의 값을 필터링하여 작동해야합니다.

생성자 후 값을 필터링하는 경우 어댑터가 먼저 값으로 초기화 한 후 필터가 있기 때문에 nonstoprun에 보관되지 않는