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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于mAdapter.notifyDataSetChanged()无效问题

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

一般android listview?notifyDataSetChanged()沒有效果,就是下面的三種情況:

1、數據源沒有更新,調用notifyDataSetChanged無效。

2、數據源更新了,但是它指向新的引用,調用notifyDataSetChanged無效。

3、數據源更新了,但是adpter沒有收到消息通知,無法動態更新列表。

第一種沒有什么可說的,查看數據源為什么沒有數據更新,是不是沒有把數據加載進來。

第二種就是指向地址出現了問題,如:

  • //適配器的數據源??
  • public?List<String>?mDatas;??
  • ??
  • /**?獲取數據的方法?*/??
  • public?void?getData()?{??
  • ??
  • ????//一個臨時變量,用于存放數據??
  • ????List<String>?fileItemList?=?new?ArrayList<String>();??
  • ????//生成隨機數,控制循環次數??
  • ????int?sum?=?new?Random().nextInt(10);??
  • ????for(int?i=0;i<sum;i++){??
  • ????????fileItemList.add(i?+?"?");??
  • ????}??
  • ??????
  • ????//然后給數據源賦值??
  • ????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;??
  • ????}??
  • }??
  • ??
  • /**?初始化時給listView設置適配器?*/??
  • public?void?init(){??
  • ????MyAdapter?mAdapter?=?new?MyAdapter();??
  • ????mListView.setAdapter(mAdapter);??
  • }??
  • ??
  • /**?刷新UI?*/??
  • public?void?refreshUI(){??
  • ????//更新數據??
  • ????getData();??
  • ????//告訴適配器數據已更新??
  • ????mAdapter.notifyDataSetChanged();??
  • } ?
  • 以為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()无效问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。