ListViewでスクロールの際に前スクロールしたものが表示されたりする

ListViewはViewを再利用するんです。

listViewに自作のAdapterをセットする際、画面に映っているところはAdapterにaddした順に表示されるんだけど、スクロールすると前に表示されていたやつや順番がめちゃくちゃになったり重複したりとかなり不安定な挙動に陥った。

listViewのキャッシュかなんかかなーって思っていたけど、どうやらviewの再利用に問題があるらしい。

で、ListViewに入れ込む要素を作っていたAdapterを変更してみる

変更前

    public View getView(int position, View convertView,ViewGroup parent) {
        View view = convertView;

        Shop shop = this.getItem(position);

        if (convertView == null) {
            view = layoutInflater.inflate(R.layout.list_item, null);
            /**
             * Viewに値を設定 
             */
            .........................
        }
        return view;
    }

変更後

    public View getView(int position, View convertView,ViewGroup parent) {
        View view = convertView;

        Shop shop = this.getItem(position);

        if (convertView == null) {
            view = layoutInflater.inflate(R.layout.list_item, null);
        }
        /**
         * Viewに値を設定 
         */
        .........................
        return view;
    }

今までは、Viewがあったらデータを作成していたが、Viewを初期化するタイミングでデータを設定していたが、viewの有無にかかわらずデータを設定することで正常に動いた。
getViewの第2引数をちゃんと理解していないからこうなるんだな。。