カスタム 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 に新しいアイテムを追加するようなものです。
アイデア、提案はありますか?