0

カスタム ArrayAdapter で奇妙な状況が発生しました。アダプターを新しいデータで更新しようとすると、データが更新されるのではなく、新しいデータがリストビューの先頭に挿入され、リストビューをスクロールすると古いデータが表示されたままになります。

アップデート

この問題は、フラグメント バンドルの ArrayList が原因のようです。フラグメント バンドルの onCreateView でリストビューを設定しない場合、更新コードは正常に動作しますが、なぜこれを行うのかがわかりません。

ArrayList<Collection> cityStoresList = fragmentBundle.getParcelableArrayList("stores");     
mStoresList.addAll(cityStoresList);

アイテムが常にリストに残る原因になっていますか?

更新の終了

コードの一部を次に示します (コレクションはカスタム オブジェクト モデル クラスです)。

ArrayList<Collection> mStoresList = new ArrayList<Collection>();

/** List Adapter */
private StoresListAdapter mListAdapter;

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    boolean attach = false;
    if (container == null) {
        attach = true;
    }

    Bundle fragmentBundle = getArguments();
    ArrayList<Collection> cityStoresList = fragmentBundle.getParcelableArrayList("stores");     
    mStoresList.addAll(cityStoresList);

//inflater code not added here, but is present

mListAdapter = new StoresListAdapter(getActivity(), mStoresList);
        mListView.setAdapter(mListAdapter);

return layout;
}

私のカスタムアダプターは次のとおりです。

    public class StoresListAdapter extends ArrayAdapter<Collection> {

        public StoresListAdapter(Context c, ArrayList<Collection> array) {
            super(c, 0, array);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // View from recycle
            View row = convertView;

            // Handle inflation
            if (row == null) {
                LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = inflater.inflate(R.layout.row_store, null);
            }

            // Get the Store
            Collection store = getItem(position);
                    //rest of code follows

            return row;
       }
   }

アダプターを更新する場合は、次を使用します。

public void updateAdapter(ArrayList<Collection> storesList, final int listIndex) {
    mStoresList.clear();    
    mStoresList.addAll(storesList);         
        mListAdapter.notifyDataSetChanged();
     }

そして、これは私が言及した問題を引き起こします。新しいアイテムは問題なく表示されますが、以前のアイテムは引き続き表示され、新しいアイテムの後に追加されます。古いアイテムを単に置き換えるのではなく、最初のアイテムとして ArrayList に新しいアイテムを追加するようなものです。

アイデア、提案はありますか?

4

1 に答える 1

0

さて、ようやく問題が見つかりました。

すべてがフラグメント内にあるため、配列をアタッチするときにoncreateViewが実際に呼び出されます。したがって、ビューが実際に表示される前に、updateAdapterメソッドが呼び出され、アイテムが追加および表示されます。

次に、oncreateViewメソッドが起動され、元のバンドルアイテムがArraylistに追加されます。

于 2013-01-24T11:48:17.963 に答える