私のアプリはMultiColumnListView
( https://github.com/huewu/PinterestLikeAdapterView )を使用しており、その名前が示すように、複数列のリストビューの作成に役立ちます。
ライブラリは素晴らしいですが、彼らが指定しているように、フィルタリングはサポートされていません。
だから私は簡単な編集テキストで自分のテキストフィルター機能を作成しようとしています。
最後に、リストをフィルタリングすることにしましたが、リストを渡すため、listViewを更新してsetAdapterを呼び出す必要があります。
_MyAdapter adapter = new MyAdapter(this,myList);
listView.setAdapter(adapter);
_
listView.invalidateViews()
またはadapter.notifyDataSetChanged()
を実行すると、listViewは更新されますが、古いリストが使用されます。
SetAdapterを呼び出す最良の方法はどれですか?または多分これを行う別の方法です。
前もって感謝します
編集:
_//Method that filters the list
Log.i("On filter myList.size()",""+myList.size());
adapter.notifyDataSetChanged();
//on the Adapter
Log.i("On Adapter myList.size()",""+myList.size());
_
ログ:
アダプタクラス:
_public class MiAdaptadorListaComercios extends BaseAdapter{
//Textview and Imageviews declarations
private Context contexto;
private List<Comercio> myList;
public MiAdaptadorListaComercios(Context c,List<Comercio> myList){
this.contexto = c;
this.myList = new ArrayList<Comercio>();
this.myList = myList;
}
@Override
public int getCount() {
Log.i("On Adapter myList.size()",""+listaComercios.size());
return myList.size();
}
@Override
public Object getItem(int position) {
return myList.get(position);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view =null;
if(convertView == null)
{
LayoutInflater inflater = (LayoutInflater) contexto.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_cell, null);
}
else{
view = convertView;
}
//set views Texteviews text,font etc...
return view;
}
_
}
アクティビティクラス:
_public class ListaComercio extends Activity {
private MultiColumnListView mAdapterView = null;
EditText searchBar;
private ArrayList<Comercio> myList;
private ArrayList<Comercio> filteredList;
MyAdapter adapter;
public ListaComercio(){
myList = new ArrayList<Comercio>();
filteredList = new ArrayList<Comercio>();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.lista_comercios);
mAdapterView = (MultiColumnListView) findViewById(R.id.list);
adapter = new MyAdapter(ListaComercio.this,myList);
mAdapterView.setAdapter(adapter);
searchBar.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
CharSequence filer = v.getText();
for(Comercio co : myList)
{
if(co.getName().contains(filer))
{
filteredList.add(co);
}
}
myList = filteredList;
Log.i("On filter myList.size()",""+myList.size());
myList.clear();
adapter.notifyDataSetChanged();
//mAdapterView.invalidateViews();
return true;
}
return false;
}
});
}
}
_
myList
を変更してadapter.notifyDataSetChanged()
を呼び出すだけで、毎回新しいアダプタを設定しないでください。
カスタムアダプタのコンストラクタで、ArrayListを引数として取るsuper
を呼び出します。
これを呼び出す:
public MiAdaptadorListaComercios(Context c,List<Comercio> myList){
super(c,0,myList);
this.contexto = c;
this.myList = myList;
}
問題は次の行にあるので、アダプタを保持できます。
myList = filteredList;
参照を変更する代わりに、リスト自体を変更する必要があります。
myList.clear();
myList.addAll(filteredList);
これを行うことにより、元のリストが失われます。完全なリストを持ち、onCreateでmyListを初期化するed originalListという別のリストを保持することをお勧めします。
myList=new ArrayList(originalList);
したがって、リセットするたびに、次の電話をかけるだけです。
myList.clear();
myList.addAll(originalList);
とで
for(Comercio co : originalList)
{
if(co.getName().contains(filer))
{
filteredList.add(co);
}
}
古いmyList.clear()
をクリアしてから、adapter.notifyDataSetChanged()
を呼び出す必要があります
更新:
次のようにコードを変更します。
public MiAdaptadorListaComercios(Context c,List<Comercio> myList){
this.contexto = c;
this.myList = new ArrayList<Comercio>();
}
また、それは好きですか
myList.clear();
myList.addAll(originalList);