NotifyDataSetChanged () не обновляющий адаптер

Список адаптеров обновляется на широковещательном приемнике.

Все работает нормально, если размер списка адаптеров больше 1, означает, что мой recyclerview уже имеет одну строку, а затем обновляет список. Но если размер списка идет от 0 до 1, то мой адаптер уведомляет набор данных. Нет данных о повторном просмотре. Я не знаю, почему он не работает.

Класс Recyclerview:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { v = inflater.inflate(R.layout.job_recyclerview, container, false); getActivity()); initialise(v); init(); showNoTaskMessage(); new loadListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); mMyBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Here you can refresh your listview or other UI SlidingTab.slidingTab.getTabAt(0).setText("New (" + SingleTon.getInstance().getNewjob() + ")"); SlidingTab.slidingTab.getTabAt(1).setText("In Progress (" + SingleTon.getInstance().getInprogressjob() + ")");; SlidingTab.slidingTab.getTabAt(2).setText("Completed (" + SingleTon.getInstance().getCompletedjob() + ")"); } }; try { IntentFilter filter = new IntentFilter("newJob"); LocalBroadcastManager.getInstance(context).registerReceiver(mMyBroadcastReceiver, filter); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return v; } 

Класс адаптера:

  public JobAdapter(ArrayList<Info> myDataset, Context context) { this.mDataset = myDataset; this.mAct = context; } public void addApplications(ArrayList<Info> candidates) { if (this.filterList == null) { filterList = new ArrayList<>(); } this.mDataset.clear(); this.mDataset.addAll(candidates); this.filterList.addAll(mDataset); this.notifyItemRangeInserted(0, candidates.size() - 1); } public void clearApplications() { int size = this.mDataset.size(); if (size > 0) { for (int i = 0; i < size; i++) { mDataset.remove(0); filterList.remove(0); } this.notifyItemRangeRemoved(0, size); } } @Override public int getItemViewType(int position) { return VIEW_NORMAL; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_job_card, parent, false); ViewHolder fh = new ViewHolder(v); return fh; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { // holder.jobPhone.setText(mDataset.get(position).mobileNo); holder.jobNumber.setText(mDataset.get(position).jobNumber); holder.jobTime.setText(mDataset.get(position).time); holder.jobAddress.setText(mDataset.get(position).address); // holder.jobInstructionText.setText(mDataset.get(position).spclInstruction); if (mDataset.get(position).jobStatus != null && mDataset.get(position).jobStatus.equalsIgnoreCase("Completed")) { holder.endsat.setText("Submitted at"); holder.jobTime.setText(mDataset.get(position).completedOnString); holder.jobTimeLeft.setVisibility(View.INVISIBLE); holder.timerImage.setVisibility(View.INVISIBLE); } else { if (mDataset.get(position).status.equalsIgnoreCase("Active")) { holder.jobTimeLeft.setText(mDataset.get(position).appointmentTime); } else { holder.jobTimeLeft.setText("-" + mDataset.get(position).appointmentTime); } } holder.jobLayout1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SingleTon.getInstance().setWorkDescHolder(mDataset.get(position).descHolder); FragmentManager fragmentManager = ((FragmentActivity) mAct).getSupportFragmentManager(); FragmentTransaction ft = ((FragmentActivity) mAct).getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.glide_fragment_horizontal_in, R.anim.glide_fragment_horizontal_out); ft.replace(R.id.content_frame1, new DetailsFragment(), "persondetails"); ft.addToBackStack("persondetails"); // Start the animated transition. ft.commit(); } }); } @Override public int getItemCount() { return mDataset.size(); } public class ViewHolder extends RecyclerView.ViewHolder { private TextView jobNumber, jobTimeLeft, jobStatus, jobAddress, jobEmail, jobPhone, timeTimer, jobInstructionText, jobTime, endsat; private ImageView timerImage; private FrameLayout frameLayout; private CardView cardView; private LayoutRipple jobLayout1; public ViewHolder(View v) { super(v); this.jobNumber = (TextView) v.findViewById(R.id.job_number); this.jobTime = (TextView) v.findViewById(R.id.job_time); this.jobTimeLeft = (TextView) v.findViewById(R.id.job_timertext); this.timerImage = (ImageView) v.findViewById(R.id.timerimage); this.cardView = (CardView) v.findViewById(R.id.card_view); // this.jobStatus = (TextView) v.findViewById(R.id.job_status); this.jobAddress = (TextView) v.findViewById(R.id.job_addresstext); // this.jobInstructionText = (TextView) v.findViewById(R.id.instruction_text); // this.jobLayout = (LayoutRipple)v.findViewById(R.id.job_cardLayout); this.jobLayout1 = (LayoutRipple) v.findViewById(R.id.cardLayout1); this.endsat = (AppCompatTextView) v.findViewById(R.id.endsat); this.jobNumber.setTypeface(Utils.RegularTypeface(mAct)); this.jobAddress.setTypeface(Utils.RegularTypeface(mAct)); this.jobTimeLeft.setTypeface(Utils.RegularTypeface(mAct)); this.jobTime.setTypeface(Utils.RegularTypeface(mAct)); } } } 

Пожалуйста, помогите мне найти ошибку или какой-нибудь другой подход. благодаря

Вызовите задачу загрузки данных внутри onReceive() BroadcastReceiver

  mMyBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Here you can refresh your listview or other UI new loadListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); SlidingTab.slidingTab.getTabAt(0).setText("New (" + SingleTon.getInstance().getNewjob() + ")"); SlidingTab.slidingTab.getTabAt(1).setText("In Progress (" + SingleTon.getInstance().getInprogressjob() + ")");; SlidingTab.slidingTab.getTabAt(2).setText("Completed (" + SingleTon.getInstance().getCompletedjob() + ")"); } }; 

А также выполните следующие изменения в классе адаптера .

  public void addApplications(ArrayList<Info> candidates) { if (this.filterList == null) { filterList = new ArrayList<>(); } this.mDataset.clear(); this.mDataset.addAll(candidates); this.filterList.addAll(mDataset); this.notifyItemRangeInserted(0, candidates.size()); } public void clearApplications() { int size = this.mDataset.size(); if (size > 0) { for (int i = 0; i < size; i++) { mDataset.remove(i); filterList.remove(i); } this.notifyItemRangeRemoved(0, size); } } 

Надеюсь, что это работает!

Измените это:

 mMyBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Here you can refresh your listview or other UI recycleAdapter.addItems(SingleTon.getInstance() .getInfoArrayList()); // I'm assuming your "SingleTon.getInstance().getInfoArrayList()" is the received data. } 

На вашем адаптере

 public void addItems(List<Info> itemsList) { // This check could be avoided if you declared your mDataset final if(mDataset == null) { mDataset = new ArrayList<>(); } int prevSize = mDataset.size(); mDataset.addAll(itemsList); notifyItemRangeInserted(prevSize, itemsList.size()); } 

Вы не должны вызывать notifyDataSetChanged () после this.notifyItemRangeInserted(0, candidates.size() - 1); Попробуйте что-то вроде этого:

Поместите этот метод в класс адаптера

 public void setData(ArrayList<Info> infos) { this.mDataset = infos; notifyDataSetChanged(); } 

И назовите его так:

 ArrayList<Info> list = SingleTon.getInstance().getInfoArrayList().isEmpty(); if (list != null && !list.isEmpty()) { recycleAdapter.setData(list); } 

Исправьте этот метод в своем адаптере

 @Override public int getItemCount() { return mDataset != null && !mDataset.isEmpty() ? mDataset.size() : 0; } 

Основываясь на вашем коде, нам нужен список переменных для хранения ваших информационных данных.

 //Declare the info list private ArrayList<Info> mInfos = new ArrayList<Info>() 

В вашем onCreateView() установите mInfos в recycleAdapter

 recycleAdapter = new JobAdapter(mInfos, getActivity()); recyclerView.setAdapter(recycleAdapter); 

Поэтому каждый раз, когда вы хотите установить новый информационный список. Просто назначьте его mInfos и убедитесь, что вы mInfos предыдущие данные списка, чтобы избежать дублирования данных.

 mInfos.clear() mInfos.addAll(SingleTon.getInstance().getInfoArrayList()); //refresh data recycleAdapter.notifyDataSetChanged(); 

Я не уверен, где вы используете clearApplications () в JobAdapter.class. Но, похоже, это неправильно. В for-loop вы пытаетесь удалить значение в индексе 0 каждый раз, а не индекс «i». Надеюсь это поможет.

Когда вы используете пользовательский адаптер, notifyDatasetChange () не вызывается извне этого адаптера, поэтому добавьте функцию addItem в адаптер и добавьте новый список в списке адаптеров и вызовите notifyDataSetChanged

 public void addItem(List<Model> list) { if (lit != null) { clear(); adapterList.addAll(list); } notifyDataSetChanged(); } 

Изменить в своем классе recyclerview.

 //Change condition ">1" to "!=null" if (SingleTon.getInstance().getInfoArrayList().size() != null) { recycleAdapter.addApplications(SingleTon.getInstance().getInfoArrayList()); recycleAdapter.notifyDataSetChanged(); 

А затем измените адаптер.

 public void addApplications(ArrayList<Info> candidates) { if (this.filterList == null) { filterList = new ArrayList<>(); } this.mDataset.clear(); this.mDataset.addAll(candidates); this.filterList.addAll(mDataset); this.notifyItemRangeInserted(0, mDataset.size()); //notify to mDataset } 

Надеюсь, что это сработает!

Intereting Posts
Как заставить весь макет просмотреть обновление? Google Android – как выяснить, включены ли 3g и 2g Вертикальный TextView с Ellipsize и всеми другими функциями TextView по умолчанию Как преобразовать координаты GPS в местность Список ActionBar Перемещение перекрывающих фрагментов Как использовать NDK? Начиная с приложения «hello world» Как анимировать представления при изменении смещения позиции ViewPager Как сохранить только один экземпляр фрагмента при переключении с помощью NavigationDrawer? Настройка тем, не работающих ScrollTop не работает в мобильных телефонах Android Можно ли отправлять Push Notification со стороны сервера Java автоматически 3-го месяца между датой начала и датой окончания для каждого другого пользователя? Тип несоответствия: не может преобразовать void to toast Андроид lolipop уведомление белый пустой круг Проблемы с эмулятором Android. Не обновляет изменения в xml-файлах Установка зашифрованного файла расширения apb apk в Android