关于mAdapter.notifyDataSetChanged()无效问题
一般android listview?notifyDataSetChanged()沒(méi)有效果,就是下面的三種情況:
1、數(shù)據(jù)源沒(méi)有更新,調(diào)用notifyDataSetChanged無(wú)效。
2、數(shù)據(jù)源更新了,但是它指向新的引用,調(diào)用notifyDataSetChanged無(wú)效。
3、數(shù)據(jù)源更新了,但是adpter沒(méi)有收到消息通知,無(wú)法動(dòng)態(tài)更新列表。
第一種沒(méi)有什么可說(shuō)的,查看數(shù)據(jù)源為什么沒(méi)有數(shù)據(jù)更新,是不是沒(méi)有把數(shù)據(jù)加載進(jìn)來(lái)。
第二種就是指向地址出現(xiàn)了問(wèn)題,如:
以為mDatas?只是聲明的指針,并沒(méi)有賦予指針數(shù)值地址),后來(lái)的 fileItemList ?是new出來(lái)的,有地址,就將其地址給了mDatas,當(dāng)數(shù)據(jù)刷新的時(shí)候必須是fileItemlist有數(shù)據(jù)更新,那么刷新才有效。相當(dāng)于listview中的數(shù)據(jù)是指向fileItemlist。而不是mDatas.
第三種是比較難以遇到的,遇到的也是很難理解和定位的。但恰恰是我遇到的!
當(dāng)一個(gè)listview在Oncreateview中創(chuàng)建的時(shí)候,就生命了adapter,同時(shí)將這個(gè)adater傳給listview。當(dāng)數(shù)據(jù)集(或者通過(guò)網(wǎng)絡(luò)拿回來(lái)的數(shù)據(jù))回調(diào)時(shí),將數(shù)據(jù)各類(lèi)adapter中對(duì)應(yīng)的數(shù)據(jù)集list。然后通知adapter 去notifydatasetchanged.但是可能這個(gè)頁(yè)面不在當(dāng)前的window中,只是緩存中。如:fragment已經(jīng)放到棧中緩存,沒(méi)有在當(dāng)前的activity中附著。那么adapter是不能收到數(shù)據(jù)變化的通知,那么數(shù)據(jù)就不會(huì)改變。當(dāng)fragment切換過(guò)來(lái)的時(shí)候直接走的是onresume不會(huì)再走oncreateView,也不會(huì)再次加載數(shù)據(jù)集到自己的數(shù)據(jù)集中,也就是不執(zhí)行g(shù)etAcount方法。從這也可以見(jiàn)得,adapter中拿到list數(shù)據(jù)集,是將數(shù)據(jù)集數(shù)據(jù)遍歷add自己的數(shù)據(jù)集中。那么只有自己接收到數(shù)據(jù)變化的通知,才會(huì)更新自己的數(shù)據(jù)集。那么notifydatasetchanged才會(huì)有效。
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();} ? ??
總結(jié)
以上是生活随笔為你收集整理的关于mAdapter.notifyDataSetChanged()无效问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 石头A10 Ultra智能洗地机即将到来
- 下一篇: viewmodel+livedata+b