关于mAdapter.notifyDataSetChanged()无效问题
来源:互联网 发布:cnc编程员 编辑:程序博客网 时间:2024/06/08 20:06
一般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;}@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(); }
- 关于mAdapter.notifyDataSetChanged()无效问题
- 解决mAdapter.notifyDataSetChanged()无效问题
- mAdapter.notifyDataSetChanged()无法更新UI
- RecyclerView.Adapter notifyDataSetChanged 无效问题
- MaDapter
- notifyDataSetChanged无效
- Xamarin.Android Adapter NotifyDataSetChanged无效问题
- RecyclerView 中adapter.notifyDataSetChanged()无效的问题
- 关于Android中Adapter调用notifyDataSetChanged方法无效解析
- 关于ListView中adapter调用notifyDataSetChanged无效的原因
- 解决适配器(Adapter)数据更新调用 notifyDataSetChanged()无效问题
- 解决用notifyDataSetChanged动态刷新ListView无效的问题
- 关于BaseAdapter中notifyDataSetChanged 失效的问题
- 关于adapter.notifyDataSetChanged无法更新的问题
- Android adapter.notifyDataSetChanged无效
- BaseAdapter 设置 notifyDataSetChanged 无效
- notifyDataSetChanged无效解决方案
- FragmentPagerAdapter刷新notifyDataSetChanged无效
- Oracle中创建用户
- 《Spark商业案例与性能调优实战100课》第27课:彻底解密Spark Shuffle令人费解的6大经典问题
- [Azure]使用Powershell输出某台ASM虚拟机的NSG和ACL
- CF
- PAT A1051 pop sequence
- 关于mAdapter.notifyDataSetChanged()无效问题
- SpringMVC学习笔记
- 7.PHP Cookie与Session
- 二分查找
- Gradle hello world 脚本
- opencv内存释放
- 读取图片在浏览器显示
- Spark学习日志<一>
- Android开发之获取SHA1值