web-dev-qa-db-ja.com

notifyDataSetChangedが機能しない

私のアプリはMultiColumnListViewhttps://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());
_

ログ:

enter image description here

アダプタクラス:

_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;
            }
        });
    }
    }
_
7
Andoxko

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);
                }
            }
17
vipul mittal

古いmyList.clear()をクリアしてから、adapter.notifyDataSetChanged()を呼び出す必要があります

更新:

次のようにコードを変更します。

public MiAdaptadorListaComercios(Context c,List<Comercio> myList){
this.contexto = c;
this.myList = new ArrayList<Comercio>();
}

また、それは好きですか

myList.clear();
myList.addAll(originalList);   
5
M D