NotifyDataSetChanged не работает с RecyclerView

Я получаю данные с сервера, а затем разбираю его и сохраняю в списке. Я использую этот список для адаптера RecyclerView. Я использую фрагменты.

Я использую Nexus 5 с KitKat. Для этого я использую библиотеку поддержки. Будет ли это иметь значение?

Вот мой код: (Использование фиктивных данных для вопроса)

Переменные участника:

List<Business> mBusinesses = new ArrayList<Business>(); RecyclerView recyclerView; RecyclerView.LayoutManager mLayoutManager; BusinessAdapter mBusinessAdapter; 

Мой onCreateView() :

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Getting data from server getBusinessesDataFromServer(); View view = inflater.inflate(R.layout.fragment_business_list, container, false); recyclerView = (RecyclerView) view .findViewById(R.id.business_recycler_view); recyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(mLayoutManager); mBusinessAdapter = new BusinessAdapter(mBusinesses); recyclerView.setAdapter(mBusinessAdapter); return view; } 

После получения данных с сервера parseResponse() .

 protected void parseResponse(JSONArray response, String url) { // insert dummy data for demo mBusinesses.clear(); Business business; business = new Business(); business.setName("Google"); business.setDescription("Google HeadQuaters"); mBusinesses.add(business); business = new Business(); business.setName("Yahoo"); business.setDescription("Yahoo HeadQuaters"); mBusinesses.add(business); business = new Business(); business.setName("Microsoft"); business.setDescription("Microsoft HeadQuaters"); mBusinesses.add(business); Log.d(Const.DEBUG, "Dummy Data Inserted\nBusinesses Length: " + mBusinesses.size()); mBusinessAdapter = new BusinessAdapter(mBusinesses); mBusinessAdapter.notifyDataSetChanged(); } 

Мой бизнес-адаптер:

 public class BusinessAdapter extends RecyclerView.Adapter<BusinessAdapter.ViewHolder> { private List<Business> mBusinesses = new ArrayList<Business>(); // Provide a reference to the type of views that you are using // (custom viewholder) public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextViewName; public TextView mTextViewDescription; public ImageView mImageViewLogo; public ViewHolder(View v) { super(v); mTextViewName = (TextView) v .findViewById(R.id.textView_company_name); mTextViewDescription = (TextView) v .findViewById(R.id.textView_company_description); mImageViewLogo = (ImageView) v .findViewById(R.id.imageView_company_logo); } } // Provide a suitable constructor (depends on the kind of dataset) public BusinessAdapter(List<Business> myBusinesses) { Log.d(Const.DEBUG, "BusinessAdapter -> constructor"); mBusinesses = myBusinesses; } // Create new views (invoked by the layout manager) @Override public BusinessAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.d(Const.DEBUG, "BusinessAdapter -> onCreateViewHolder()"); // create a new view View v = LayoutInflater.from(parent.getContext()).inflate( R.layout.item_business_list, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder holder, int position) { // - get element from your dataset at this position // - replace the contents of the view with that element Log.d(Const.DEBUG, "BusinessAdapter -> onBindViewHolder()"); Business item = mBusinesses.get(position); holder.mTextViewName.setText(item.getName()); holder.mTextViewDescription.setText(item.getDescription()); holder.mImageViewLogo.setImageResource(R.drawable.ic_launcher); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { Log.d(Const.DEBUG, "BusinessAdapter -> getItemCount()"); if (mBusinesses != null) { Log.d(Const.DEBUG, "mBusinesses Count: " + mBusinesses.size()); return mBusinesses.size(); } return 0; } } 

Но я не получаю данные, отображаемые в представлении. Что я делаю не так?

Вот мой журнал,

 07-14 21:15:35.669: D/xxx(2259): Dummy Data Inserted 07-14 21:15:35.669: D/xxx(2259): Businesses Length: 3 07-14 21:26:26.969: D/xxx(2732): BusinessAdapter -> constructor 

После этого я не получаю никаких журналов. Не следует ли снова getItemCount() в адаптере?

Solutions Collecting From Web of "NotifyDataSetChanged не работает с RecyclerView"

В вашем parseResponse() вы создаете новый экземпляр класса BusinessAdapter , но вы на самом деле его не используете, поэтому ваш RecyclerView не знает, что новый экземпляр существует.

Вам либо необходимо:

  • recyclerView.setAdapter(mBusinessAdapter) раз recyclerView.setAdapter(mBusinessAdapter) чтобы обновить ссылку адаптера RecyclerView, чтобы указать на новую
  • Или просто удалите mBusinessAdapter = new BusinessAdapter(mBusinesses); Для продолжения использования существующего адаптера. Поскольку вы не изменили ссылку mBusinesses , адаптер все равно будет использовать этот список массивов и должен корректно обновляться при вызове notifyDataSetChanged() .

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

 List<Business> mBusinesses2 = mBusinesses; mBusinesses.clear(); mBusinesses.addAll(mBusinesses2); //and do the notification 

Немного времени, но он должен работать.

У меня была такая же проблема. Я просто решил это с объявлением adapter public до onCreate класса.

 PostAdapter postAdapter; 

после этого

 postAdapter = new PostAdapter(getActivity(), posts); recList.setAdapter(postAdapter); 

Наконец я позвонил:

 @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); // Display the size of your ArrayList Log.i("TAG", "Size : " + posts.size()); progressBar.setVisibility(View.GONE); postAdapter.notifyDataSetChanged(); } 

Пусть это поможет вам.