首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >notifyDataSetChanged();在安卓系统中不起作用

notifyDataSetChanged();在安卓系统中不起作用
EN

Stack Overflow用户
提问于 2016-07-13 22:30:19
回答 2查看 93关注 0票数 0

这是我的代码。

代码语言:javascript
运行
复制
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.recycler_list, container, false);
    recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 3);

    adapter = new FragmentBrandList.MyAdapter(Utility.getBrandMap(), getActivity());
    recyclerView.setAdapter(adapter);

    // asynchronous call
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                Brand brand = dataSnapshot1.getValue(Brand.class);
                brandMap.put(brand.getId(), brand);
            }

            Utility.setBrandMap(brandMap);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
            Utility.displayToast("Failed to read value." + error.toException());
        }
    });
    return v;
}

最初,Utility.getBrandMap()为空。所以什么都没有显示。但是在异步调用中,我会获取并更新值,并调用adapter.notifyDataSetChanged();但它仍然不会更新UI。

这里出了什么问题?

编辑:适配器代码

代码语言:javascript
运行
复制
private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<Brand> brandList = new ArrayList<>();
    private Context context;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;

        public MyViewHolder(View view) {
            super(view);
            imageView = (ImageView) view.findViewById(R.id.thumbnail);
        }
    }

    public MyAdapter(Map<String, Brand> brands, Context context) {
    //public MyAdapter(List<Brand> brands, Context context) {
        this.brandList = new ArrayList<>(brandMap.values());
        //this.brandList = brands;
        this.context = context;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_brand, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        if (brandList != null && brandList.size() > 0) {
            Brand brand = brandList.get(position);
            Glide.with(context).load(String.valueOf(brand.getImage()))
                    .error(R.drawable.placeholder)
                    .placeholder(R.drawable.placeholder)
                    .into(holder.imageView);
        }
    }

    @Override
    public int getItemCount() {
        return brandList.size();
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-07-13 22:45:28

试试这个:

代码语言:javascript
运行
复制
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.recycler_list, container, false);
    recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 3);

    adapter = new FragmentBrandList.MyAdapter(Utility.getBrandMap(), getActivity());
    recyclerView.setAdapter(adapter);

    // asynchronous call
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                Brand brand = dataSnapshot1.getValue(Brand.class);
                brandMap.put(brand.getId(), brand);
            }

            adapter.setBrandMap(brandMap);

        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
            Utility.displayToast("Failed to read value." + error.toException());
        }
    });
    return v;
}

在适配器代码中:

代码语言:javascript
运行
复制
private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<Brand> brandList = new ArrayList<>();
    private Context context;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;

        public MyViewHolder(View view) {
            super(view);
            imageView = (ImageView) view.findViewById(R.id.thumbnail);
        }
    }

    public MyAdapter(Map<String, Brand> brands, Context context) {
    //public MyAdapter(List<Brand> brands, Context context) {
        this.brandList = new ArrayList<>(brandMap.values());
        //this.brandList = brands;
        this.context = context;
    }

    public void setBrandMap(Map<String, Brand> brandMap){
      this.brandList = new ArrayList<>(brandMap.values());
      notifyDataSetChanged();
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_brand, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        if (brandList != null && brandList.size() > 0) {
            Brand brand = brandList.get(position);
            Glide.with(context).load(String.valueOf(brand.getImage()))
                    .error(R.drawable.placeholder)
                    .placeholder(R.drawable.placeholder)
                    .into(holder.imageView);
        }
    }

    @Override
    public int getItemCount() {
        return brandList.size();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-07-13 22:45:28

您正在向MyAdapter的构造函数传递一个空的Map。一旦异步查询完成,映射就被填满了,但是适配器中的brandList并不知道任何关于新数据的信息。因此,您要做的是将新项添加到适配器内的List中。

将以下方法添加到适配器:

代码语言:javascript
运行
复制
public void addValues(Map<String, Brand> brands){
    brandList.clear();
    brandList.addAll(brands.values());
    notifyDataSetChanged();
}

并在异步查询完成后调用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38354555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档