2013-01-24 129 views
0

我有一个奇怪的情况与自定义ArrayAdapter。 当我尝试用新数据更新adpater而不是正在更新的数据时,新数据将插入到listview的开头,并且一旦滚动listview,旧数据就会保留并可见。更新ArrayAdapter问题

UPDATE

看来这个问题是由从片段包中的ArrayList引起的。 如果我不从片段包设置列表视图中onCreateView,我更新的代码工作正常,但现在我困惑,为什么这样的:

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

导致该项目始终保持在名单上? UPDATE OF

END

下面是部分代码:(Collection是一个自定义对象模型类)

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中的新项目作为第一项,而不是只替换旧项目。

任何想法,建议?

+0

中的addAll补充说,它不会删除任何东西...... – njzk2

+0

是的,但在此之前,我将其清除添加新的列表。 – Lefteris

+0

你从哪里得到storesList? – njzk2

回答

0

好的,终于找到了问题。

因为整件事都在一个片段内,所以oncreateView实际上是在我附加数组时调用的,所以会发生什么是我的updateAdapter方法被调用,项目被添加并显示在视图实际可见之前。

然后oncreateView方法被触发,原件捆的项目被添加到ArrayList ....