日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

关于mAdapter.notifyDataSetChanged()无效问题

發(fā)布時(shí)間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于mAdapter.notifyDataSetChanged()无效问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一般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)題,如:

  • //適配器的數(shù)據(jù)源??
  • public?List<String>?mDatas;??
  • ??
  • /**?獲取數(shù)據(jù)的方法?*/??
  • public?void?getData()?{??
  • ??
  • ????//一個(gè)臨時(shí)變量,用于存放數(shù)據(jù)??
  • ????List<String>?fileItemList?=?new?ArrayList<String>();??
  • ????//生成隨機(jī)數(shù),控制循環(huán)次數(shù)??
  • ????int?sum?=?new?Random().nextInt(10);??
  • ????for(int?i=0;i<sum;i++){??
  • ????????fileItemList.add(i?+?"?");??
  • ????}??
  • ??????
  • ????//然后給數(shù)據(jù)源賦值??
  • ????mDatas?=?fileItemList;??
  • }??
  • ??
  • /**?自定義的適配器?*/??
  • class?MyAdapter?extends?BaseAdapter{??
  • ??
  • ????@Override??
  • ????public?int?getCount()?{??
  • ????????if(mDatas!=null){??
  • ????????????return?mDatas.size();??
  • ????????}??
  • ????????return?0;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?Object?getItem(int?position)?{??
  • ????????if(mDatas!=null){??
  • ????????????return?mDatas.get(position);??
  • ????????}??
  • ????????return?null;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?long?getItemId(int?position)?{??
  • ????????return?position;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{??
  • ????????TextView?tv?=?new?TextView(getActivity());??
  • ????????tv.setText(mDatas.get(position));??
  • ????????return?tv;??
  • ????}??
  • }??
  • ??
  • /**?初始化時(shí)給listView設(shè)置適配器?*/??
  • public?void?init(){??
  • ????MyAdapter?mAdapter?=?new?MyAdapter();??
  • ????mListView.setAdapter(mAdapter);??
  • }??
  • ??
  • /**?刷新UI?*/??
  • public?void?refreshUI(){??
  • ????//更新數(shù)據(jù)??
  • ????getData();??
  • ????//告訴適配器數(shù)據(jù)已更新??
  • ????mAdapter.notifyDataSetChanged();??
  • } ?
  • 以為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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。