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();
}
}
필터링 된 목록도 - 비록 어댑터 값은 모든 초를 업데이트 유지되지 않는 이유.
을 (여과 당신은 아마도 UI의 결함을 얻을 것이다)는 건설 기능 매초마다 새로운 어댑터. 새 어댑터는 필터가 적용된 이전 어댑터를 대체합니다. Btw 왜 매초마다 새로운 어댑터를 만들어야합니까? –
서버에서 수정 된 값을 가져와 최근 값을 표시하기 위해 어댑터에서 업데이트해야합니다. – user2269164