Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

notifyDataSetChanged() not refreshing adapter

My adapter list is refreshing on broadcast receiver .

Everything is working fine if adapter list size is greater than 1 , means if my recyclerview has already one row shwoing then list refreshing just fine . But if list size goes from 0 to 1 then my adapter notify dataset Changed stop working . No data shows on recyclerview. I don't know why it is not working .

Recyclerview Class:

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

Adapter class :

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

Please help me finding the bug or some other approach . Thanks

like image 267
young_08 Avatar asked Aug 09 '16 06:08

young_08


People also ask

How do I use notifyDataSetChanged in Kotlin?

How do I use notifyDataSetChanged in Kotlin? To refresh the ListView in Android, call notifyDataSetChanged() method on the Adapter that has been set with the ListView. Also note that the method notifyDataSetChanged() has to be called on UI thread.

What happens when we call notifyDataSetChanged?

notifyDataSetChanged() was called. all Adapter subclasses Adapter reference must call notifyDataSetChanged() when their underlying data has changed, to let the observing view (ListView and such) know that it should refresh itself because the data changed / there is new data.

How do you call notifyDataSetChanged from another class?

If you are accessing it from outside scope, you can get it from the ListView object and cast it so you can call notifyDataSetChanged(). Like so: ServerItemAdapter listAdapter = (ServerItemAdapter) listView. getAdapter(); listAdapter.


1 Answers

Call the data loading task inside the onReceive() of 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() + ")");

        }

    };

And also do following changes in your Adapter class.

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

Hope that works!

like image 74
Amresh Avatar answered Oct 09 '22 01:10

Amresh