2
正常に動作している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);
}
私はsearchviewに文字列を入力した後ので、リストビューを濾過されているが、それはフィルタリングされた値を保持していないと、すぐにそれは完全なリストビューを示しています。
@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