2016-07-13 3 views
0

Это мой код.notifyDataSetChanged(); не работает в android

@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() имеет значение null. поэтому примечание отображается. но при асинхронном вызове я получаю и обновляю значение и вызываю адаптер.notifyDataSetChanged(); но все же он не обновляет пользовательский интерфейс.

Что здесь не так?

Edit: код адаптера

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(); 
    } 
} 
+0

Пожалуйста, разместите весь код адаптера. Особенно в той части, где мы можем увидеть поле, которое должно заполнить адаптер (brandMap). – reVerse

+0

@reVerse Добавлен код адаптера. –

ответ

2

Попробуйте это:

@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; 
} 

И в коде адаптера:

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

можно передать пустой Map конструктору ваш MyAdapter , Как только асинхронный запрос завершен, карта заполняется, но brandList в вашем адаптере ничего не знает о новых данных. Итак, что вы хотите сделать, это добавить новые элементы в List внутри адаптера.

Добавьте следующий метод к адаптеру:

public void addValues(Map<String, Brand> brands){ 
    brandList.clear(); 
    brandList.addAll(brands.values()); 
    notifyDataSetChanged(); 
} 

и назовите его, как только асинхронный запрос завершен.

Смежные вопросы