我有一个自定义 ArrayAdapter 的奇怪情况。当我尝试使用新数据更新 adpater 时,新数据不会被更新,而是插入到列表视图的开头,并且一旦滚动列表视图,旧数据就会保留并可见。
更新
似乎问题是由片段包中的 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 中添加新项目作为第一个项目,而不是仅仅替换旧项目。
有什么想法、建议吗?