notifyDataSetChangedでListViewが更新される場合とされない場合がある
現在ListViewを使用してアプリを作っているのですが、adapterの更新で不可解な箇所がありましたので質問させていただきます。
ArrayAdapterを継承したMyArrayAdapterクラス内で
public void setData(MessageData mData) {
this.messageData = mData;
if (messageData.getMessageList().isEmpty()) {
this.messageDetailList = messageData.getMessageList();
}
notifyDataSetChanged();
}
としています。
データの更新があったらsetData
を呼び出してMyArrayAdapterを更新しているのですが、更新される場合とされない場合があります。
- MethodAから呼ぶと更新される:
getView
が呼ばれてListViewに反映される - MethodBから呼ぶと更新されない: 更新されたデータだけ
getView
が呼ばれず、ListViewに反映されない(元々入っていた要素に関しては'getView'が呼ばれている) - MethodA、MethodBはMainThreadから実行している(各メソッド内でThread確認済み)
ほとんど同じ処理であり、Listデータの数も更新されたものが渡されています。MyArrayAdapterが保持するListデータもMethodAの場合もMethodBの場合もsizeが更新されて数が増えているのですが、MethodBで実行すると新規で追加したデータに関してのみListViewに更新がかからない状態です。
MethodBで呼び出した場合は新規データの箇所のみMyArrayAdapterのgetViewが呼ばれず、
既存のデータに関してはgetViewが呼ばれます。
つまりMethodBの場合は表示が変更されません。
MethodBの実装
Hogeクラス内で
public void MethodB(JSONArray array){ //JSONからListを取り出す ListmessageList=jsonUtil.getMessageDataList(array); if(messageList.size()!=0){ userData.addMessageDataAll(messageList); userData=saveDataUtil.setUserData(userData); messageData=userData.getMessageData("ID"); if(messageData!=null){ //この時点では新規データが入っており更新されている messageData.getMessageList().size()="+messageData.getMessageList().size()); adapter.setData(messageData); //ここでlist.getCount()したがサイズが増えていない。 listView.setSelection(listView.getCount()-1); }else{ Log.e(TAG,"messageData==null"); } }
MethodAの実装
public void MethodA(JSONArray array){ List detailList=jsonUtil.getMessageDetailList(array); Log.d(TAG,"送信したMessageDetail messageDetailList.size="+detailList.size()); if(detailList.size()!=0){ MessageDetail detail=detailList.get(0); messageData.addMessageList(detail); userData.setMessageData(messageData); userData=saveDataUtil.setUserData(userData);//userData保存 messageData=userData.getMessageData("ID"); if(messageData!=null){ adapter.setData(messageData); }else{ Log.e(TAG,"userData.messageData==null"); } listView.setSelection(listView.getCount()-1); }
MethodAとMethodBは共にVolleyのJSONArray取得メソッドから呼び出されています。
この場合どのような状況が考えられるのでしょうか?