2017-01-04 3 views
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(); 
} 
} 

フィルタリングされたリストが維持されていないのはなぜ。

+0

を濾過されるよう、おそらくUIでグリッチを取得します毎秒新しいアダプタ。新しいアダプタは、フィルタが適用された古いアダプタを置き換えます。 Btwなぜあなたは毎秒新しいアダプタを構築する必要がありますか? –

+0

私はサーバーから変更された値を取得し、最近の値を表示するためにそれらをアダプタで更新する必要があります。 – user2269164

答えて

0

サーバーから値を更新する必要があります。パラメータとしてクエリ文字列を渡すアダプタ用の新しいコンストラクタを書くことができます(空でない場合もあります)。 コンストラクタ内の値をフィルタ処理します。

あなたは、コンストラクタの後に値をフィルタする場合、アダプタが最初にすべての値で初期化した後、フィルタが原因でビルドnonstoprun()関数に保管されていない

関連する問題