关于mAdapter.notifyDataSetChanged()无效问题
一般android listview?notifyDataSetChanged()沒有效果,就是下面的三種情況:
1、數據源沒有更新,調用notifyDataSetChanged無效。
2、數據源更新了,但是它指向新的引用,調用notifyDataSetChanged無效。
3、數據源更新了,但是adpter沒有收到消息通知,無法動態更新列表。
第一種沒有什么可說的,查看數據源為什么沒有數據更新,是不是沒有把數據加載進來。
第二種就是指向地址出現了問題,如:
以為mDatas?只是聲明的指針,并沒有賦予指針數值地址),后來的 fileItemList ?是new出來的,有地址,就將其地址給了mDatas,當數據刷新的時候必須是fileItemlist有數據更新,那么刷新才有效。相當于listview中的數據是指向fileItemlist。而不是mDatas.
第三種是比較難以遇到的,遇到的也是很難理解和定位的。但恰恰是我遇到的!
當一個listview在Oncreateview中創建的時候,就生命了adapter,同時將這個adater傳給listview。當數據集(或者通過網絡拿回來的數據)回調時,將數據各類adapter中對應的數據集list。然后通知adapter 去notifydatasetchanged.但是可能這個頁面不在當前的window中,只是緩存中。如:fragment已經放到棧中緩存,沒有在當前的activity中附著。那么adapter是不能收到數據變化的通知,那么數據就不會改變。當fragment切換過來的時候直接走的是onresume不會再走oncreateView,也不會再次加載數據集到自己的數據集中,也就是不執行getAcount方法。從這也可以見得,adapter中拿到list數據集,是將數據集數據遍歷add自己的數據集中。那么只有自己接收到數據變化的通知,才會更新自己的數據集。那么notifydatasetchanged才會有效。
public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {Log.i("NewOrderFragment","onCreateView");View view = inflater.inflate(R.layout.fragment_new_order, container, false);orderService = new OrderServiceImpl();listView = (ListView) view.findViewById(R.id.new_order_list);token = App.getInstance().sellerInfo.getToken();sellerid = String.valueOf(App.getInstance().sellerInfo.getSellerid());Log.i("lxl","rquest : sellerid:" + sellerid);mNewOrderAdapter = new NewOrderAdapter(getContext(), listOrder, NewOrderFragment.this);listView.setAdapter(mNewOrderAdapter);requestData();return view; }@Override public void onResume() {super.onResume();//mNewOrderAdapter.notifyDataSetChanged(); }public void requestData() {orderService.newOrderlist(sellerid, String.valueOf(pageindex), String.valueOf(pagesize), token).subscribe(new Action1<List<Order>>() {@Override public void call(List<Order> listorder) {if(listorder != null && listorder.size() != 0){for(int i=0;i<listorder.size();i++)listOrder.add(listorder.get(i);//mNewOrderAdapter = new NewOrderAdapter(getContext(), listOrder, NewOrderFragment.this); //listView.setAdapter(mNewOrderAdapter); mNewOrderAdapter.notifyDataSetChanged();} ? ??
總結
以上是生活随笔為你收集整理的关于mAdapter.notifyDataSetChanged()无效问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 石头A10 Ultra智能洗地机即将到来
- 下一篇: 耳机进水晾多久(耳机品牌推荐)