关于mAdapter.notifyDataSetChanged()无效问题

来源:互联网 发布:cnc编程员 编辑:程序博客网 时间:2024/06/08 20:06

一般android listview notifyDataSetChanged()没有效果,就是下面的三种情况:

1、数据源没有更新,调用notifyDataSetChanged无效。

2、数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效。

3、数据源更新了,但是adpter没有收到消息通知,无法动态更新列表。

第一种没有什么可说的,查看数据源为什么没有数据更新,是不是没有把数据加载进来。

第二种就是指向地址出现了问题,如:

  1. //适配器的数据源  
  2. public List<String> mDatas;  
  3.   
  4. /** 获取数据的方法 */  
  5. public void getData() {  
  6.   
  7.     //一个临时变量,用于存放数据  
  8.     List<String> fileItemList = new ArrayList<String>();  
  9.     //生成随机数,控制循环次数  
  10.     int sum = new Random().nextInt(10);  
  11.     for(int i=0;i<sum;i++){  
  12.         fileItemList.add(i + " ");  
  13.     }  
  14.       
  15.     //然后给数据源赋值  
  16.     mDatas = fileItemList;  
  17. }  
  18.   
  19. /** 自定义的适配器 */  
  20. class MyAdapter extends BaseAdapter{  
  21.   
  22.     @Override  
  23.     public int getCount() {  
  24.         if(mDatas!=null){  
  25.             return mDatas.size();  
  26.         }  
  27.         return 0;  
  28.     }  
  29.   
  30.     @Override  
  31.     public Object getItem(int position) {  
  32.         if(mDatas!=null){  
  33.             return mDatas.get(position);  
  34.         }  
  35.         return null;  
  36.     }  
  37.   
  38.     @Override  
  39.     public long getItemId(int position) {  
  40.         return position;  
  41.     }  
  42.   
  43.     @Override  
  44.     public View getView(int position, View convertView, ViewGroup parent) {  
  45.         TextView tv = new TextView(getActivity());  
  46.         tv.setText(mDatas.get(position));  
  47.         return tv;  
  48.     }  
  49. }  
  50.   
  51. /** 初始化时给listView设置适配器 */  
  52. public void init(){  
  53.     MyAdapter mAdapter = new MyAdapter();  
  54.     mListView.setAdapter(mAdapter);  
  55. }  
  56.   
  57. /** 刷新UI */  
  58. public void refreshUI(){  
  59.     //更新数据  
  60.     getData();  
  61.     //告诉适配器数据已更新  
  62.     mAdapter.notifyDataSetChanged();  
  63. }  

以为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;}@Overridepublic 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();                    }
    
0 0
原创粉丝点击