适配器adapter中notifyDataSetChanged()不起作用的其他总结

原代码(有问题的)

private CommonAdapter<Map<String, Object>> adapter;
private List<Map<String, Object>> cxDataMaps = new ArrayList<>();

private void init() {
    adapter = new CommonAdapter<Map<String, Object>>(this, R.layout.lv_general_query_data, cxDataMaps) {
        @Override
        protected void convert(ViewHolder holder, final Map<String, Object> maps, int position) {
        	holder.setText(R.id.tv_hh, maps.get("hh") + "");
            holder.setText(R.id.tv_hm, (String) maps.get("bzmc"));
            holder.setText(R.id.tv_dz, (String) maps.get("yhdz"));
            holder.setText(R.id.tv_bz, (String) maps.get("bsh"));

            holder.setOnClickListener(R.id.card_item, new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(GeneralQueryListActivity.this, PaymentActivity.class);
                    intent.putExtra("search_hh", (String) maps.get("HH"));
                    startActivity(intent);
                }
            });
        }
    };
    rv.setAdapter(adapter);

    getCXData();
}

private void getCXData() {
    PaymentRequest req = new PaymentRequest();
    Pager pager = new Pager();
    pager.setPageNumber(page);
    pager.setPageSize(pageSize);
    req.setPage(pager);
    Map<String, String> reqMap = new HashMap<>();
    reqMap.put("ygid", ygid);
    reqMap.put("mm", mm);
    reqMap.put("imei", getIMEI());
    reqMap.put("hh", hh);
    reqMap.put("bzmc", bzmc);
    reqMap.put("bsh", bsh);
    req.setMapParam(reqMap);
    String obj = JsonUtil.toJson(req);
    String request = StringUtils.encodeToRemote(obj);
    RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), request);
    cxDataMaps.clear();
    payService.getCxBcList(requestBody).enqueue(new Callback<WebStoreBean>() {
        @Override
        public void onResponse(Call<WebStoreBean> call, Response<WebStoreBean> response) {
            if (response.body() == null || response.body().getContent() == null || response.body().getContent().equals("")) {
                toastMsg("没有查询到数据!" + ((response.body() != null && response.body().getMessage() != null)
                        ? response.body().getMessage() : response.message()));
                return;
            }
            String str = StringUtils.decodeFromRemote((String) response.body().getContent());

            List<Object> list = JSON.parseArray(str);
			List<Map<String, Object>> listw = new ArrayList<Map<String, Object>>();
            for (Object object : list) {
                Map<String, Object> map = (Map<String, Object>) object;//取出list里面的值转为map
                listw.add(map);
            }
			cxDataMaps = listw;
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onFailure(Call<WebStoreBean> call, Throwable t) {
            toastMsg("数据查询失败:" + t.getMessage());
        }
    });
}

问题现象:调用notifyDataSetChanged()方法时不起作用
原因分析:代码认为cxDataMaps 这个数据源没有发生改变,所以adapter中不重新加载。
修改:数据源cxDataMaps 需要有add或者其他方法来使其发生改变。一个个Map数据直接添加到cxDataMaps 中就可以了。

List<Object> list = JSON.parseArray(str);
for (Object object : list) {
    Map<String, Object> map = (Map<String, Object>) object;//取出list里面的值转为map
    cxDataMaps.add(map);
}
adapter.notifyDataSetChanged();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过封装BaseAdapter和RecyclerView.Adapter得到的通用的,简易的Adapter。项目地址:https://github.com/tianzhijiexian/CommonAdapter 效果图:已解决的问题 提升item的独立性,完美支持item被多处复用 item会根据type来做自动复用 支持多种类型的item 一个item仅会调用一次setViews(),避免重复建立监听器 一个item仅会触发一次绑定视图的操作,提示效率 支持dataBinding和其他第三方注入框架 提供了getView()方法来简化findViewById 支持通过item的构造方法来传入Activity对象 支持通过item的构造方法来传入item事件的回调 提供了getConvertedData(data, type)方法来对item传入的数据做转换,方便拆包和提升item的复用性 支持viewpager的正常加载模式和懒加载 支持快速将listview的适配器切换为recyclerView的适配器 viewpager的notifyDataSetChanged可以正常更新界面 支持recyclerView的添加头部和底部 支持适配器的数据自动绑定,只用操作数据便可,adapter会自动notify界面零、重要接口adapter的item必须实现此接口,接口源码如下:public interface AdapterItem<T> {     /**      * @return item布局文件的layoutId      */     @LayoutRes     int getLayoutResId();     /**      * 初始化views      */     void bindViews(final View root);     /**      * 设置view的参数      */     void setViews();     /**      * 根据数据来设置item的内部views      *      * @param model    数据list内部的model      * @param position 当前adapter调用item的位置      */     void handleData(T model, int position); }例子:public class TextItem implements AdapterItem<DemoModel> {     @Override     public int getLayoutResId() {         return R.layout.demo_item_text;     }     TextView textView;     @Override     public void bindViews(View root) {         textView = (TextView) root.findViewById(R.id.textView);     }     @Override     public void setViews() { }     @Override     public void handleData(DemoModel model, int position) {         textView.setText(model.content);     } }一、ListView GridView的通用适配器——CommonAdapter只需继承CommonAdapter便可实现适配器:listView.setAdapter(new CommonAdapter<DemoModel>(data, 1) {     public AdapterItem<DemoModel> createItem(Object type) {         return new TextItem();     } });二、RecyclerView的通用适配器——CommonRcvAdapter通过继承CommonRcvAdapter来实现适配器:mAdapter = new CommonRcvAdapter<DemoModel>(data) {  public AdapterItem createItem(Object type) {         return new TextItem();   } };三、ViewPager的通用适配器——CommonPagerAdapter通过继承CommonPagerAdapter来实现适配器:viewPager.setAdapter(new CommonPagerAdapter<DemoModel>() {     public AdapterItem createItem(Object type) {         return new TextItem();     } });设计思路1. Adapter如果用adapter常规写法,你会发现代码量很大,可读性低。如果adapter有多个类型的Item,我们还得在getView()写很多if-else语句,很乱。 而现在我让adapter的代码量减少到一个8行的内部类,如果你需要更换item只需要动一行代码,真正实现了可插拔化。最关键的是item现在作为了一个独立的对象,可以方便的进行复用。2. AdapterItem和原来方式最为不同的一点就是我把adapter的item作为了一个实体,这种方式借鉴了RecyclerViewViewHolder的设计。把item作为实体的好处有很多,比如复用啊,封装啊,其余的就不细说了。3. 分层在使用过程,我发现如果adapter放在view层,那就会影响到view层的独立性。此外adapter经常有很多数据处理的操作,比如通过type选择item,数据的拆包、转换等操作。于是我还是推荐把adapter放在mvp的p层,或者是mvvm的m层。通过在实际的项目使用来看,放在m或p层的效果较好,view的复用也比较好做。
Android 开发,ListView 是常用的列表控件,而 Adapter 则是 ListView 显示列表数据的适配器。当数据源改变时,我们需要调用 AdapternotifyDataSetChanged() 方法来通知 ListView 更新数据。不过有时候,我们会发现调用 notifyDataSetChanged() 方法后,ListView 并没有更新数据,这通常是由以下几个原因造成的: 1. 数据源没有更新 在调用 notifyDataSetChanged() 方法之前,需要先确保数据源已经更新了。如果数据源没有更新,调用 notifyDataSetChanged() 方法也不会更新 ListView 显示的数据。 2. Adapter 对象没有重新设置 如果使用的是同一个 Adapter 对象,那么需要重新设置 Adapter 对象才能更新 ListView 显示的数据。可以通过 setAdapter() 方法重新设置 Adapter 对象。 3. ListView 没有重新绘制 当调用 notifyDataSetChanged() 方法后,ListView 并不会立即重新绘制,而是等到系统认为需要重新绘制时才会更新。可以通过调用 invalidate() 方法让 ListView 立即重新绘制。 4. 数据源和 Adapter 对象不匹配 如果数据源和 Adapter 对象不匹配,即数据源的数据类型和 Adapter 的数据类型不一致,调用 notifyDataSetChanged() 方法也无法更新 ListView 显示的数据。 综上所述,如果在 ListView 调用 notifyDataSetChanged() 方法无效,可以先检查数据源是否更新,是否重新设置 Adapter 对象,是否调用了 invalidate() 方法以及数据源和 Adapter 对象是否匹配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值