Vamsi Challa
Vamsi Challa

Reputation: 11109

recyclerview notifyDataSetChanged - Logical Bug

I know notifyDataSetChanged() works on RecyclerView, because i used it before and it worked without any problem. But in my current application, notifyDataSetChanged() doesn't update my RecyclerView. Will be glad if someone can spot the logical flaw in my code.

private List<ItemPetitionsTable> mAlVerified = new ArrayList<ItemPetitionsTable>();
private ViewPagerPetitionsRecyclerViewAdapter mViewPagerPetitionsRecyclerViewAdapter;
private RecyclerView mRecyclerView;
private StaggeredGridLayoutManager mStaggeredLayoutManager;

in onCreateView():

mAlVerified.clear();
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerview_verified_petitions);
mRecyclerView.setHasFixedSize(true);
mStaggeredLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mStaggeredLayoutManager);
mViewPagerPetitionsRecyclerViewAdapter = new ViewPagerPetitionsRecyclerViewAdapter(activity, mAlVerified);
mRecyclerView.setAdapter(mViewPagerPetitionsRecyclerViewAdapter);

Then network operation goes on to get data from server... and stored in local database. A call to getDataFromDatabase() is made...

private void getDataFromDatabase() {

        if (Const.DEBUGGING)
            Log.d(Const.DEBUG, "getDataFromDatabase()");

        if (mSwipeRefreshLayout.isRefreshing())
            mSwipeRefreshLayout.setRefreshing(false);

        mAlVerified = mPetitionsTableDbAdapter.getPetitionsForType(DatabaseHelper.PETITION_TYPE_ALL);
        Log.d(Const.DEBUG, "List Size: " + mAlVerified.size());

        mViewPagerPetitionsRecyclerViewAdapter.notifyDataSetChanged();

        isRefreshing = false;
    }

The Logcat shows that the list has new data: but recyclerview is not refreshed.

50.018 21055-21055/com.xx.xxx D/xxx: getDataFromDatabase()
03-09 19:09:50.019 21055-21055/com.xx.xxx D/xxx: List Size: 10

Let me know if you need anything else..

using compile 'com.android.support:recyclerview-v7:23.1.1' if this might help

public class ViewPagerPetitionsRecyclerViewAdapter extends RecyclerView.Adapter<ViewPagerPetitionsRecyclerViewAdapter.ViewHolder>
        implements Filterable {

    private List<ItemPetitionsTable> mItems = new ArrayList<>();
    private Context context;
    private SearchFilter searchFilter;

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView mTextView;
        public ImageView mImageView;

        public ViewHolder(View v) {
            super(v);
            mTextView = (TextView) v.findViewById(R.id.textView_description);
            mImageView = (ImageView) v.findViewById(R.id.imageView_main_image);
        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public ViewPagerPetitionsRecyclerViewAdapter(Context context, List<ItemPetitionsTable> items) {

        this.context = context;
        this.mItems = items;

        Log.d(Const.DEBUG, "mItems Size: " + items.size());
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewPagerPetitionsRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                                               int viewType) {

        // create a new view
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_viewpager_fragment_petitions, parent, false);
        // set the view's size, margins, paddings and layout parameters

        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, "onBindViewHolder(): " + position);

        String url = "http://xxx.org.in/Attachment/e-petition_img.jpg";

        if (mItems.get(position).getAttachments() == null
                || mItems.get(position).getAttachments().equalsIgnoreCase("")) {
            Picasso.with(context).load(url).into(holder.mImageView);
        } else {

            try {
                JSONArray array = new JSONArray(mItems.get(position).getAttachments());
                if (array.length() == 0)
                    url = "http://xxx.org.in/Attachment/e-petition_img.jpg";
                else {
                    for (int i = 0; i < array.length(); i++) {

                        JSONObject attachment_object = array.getJSONObject(i);

                        String type = attachment_object.getString("typ");
                        if (type.equalsIgnoreCase("i")) {
                            url = attachment_object.getString("Doc_path");
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            Picasso.with(context).load(url).into(holder.mImageView);
        }

        Typeface face = Typeface.createFromAsset(context.getAssets(),
                "fonts/RobotoSlab-Regular.ttf");
        holder.mTextView.setTypeface(face);
        holder.mTextView.setText(mItems.get(position).getPetition_title());


    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mItems.size();
    }

    @Override
    public Filter getFilter() {

        if (searchFilter == null)
            searchFilter = new SearchFilter();

        return searchFilter;
    }

    private class SearchFilter extends Filter {

        private PetitionsTableDbAdapter mPetitionsTableDbAdapter = DatabaseHelper.get(context).getPetitionsTableDbAdapter();

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();

            if (constraint != null && constraint.length() > 0) {

                ArrayList<ItemPetitionsTable> searchResults = new ArrayList<ItemPetitionsTable>();

                for (ItemPetitionsTable item : mItems) {

                    if (item.getPetition_number().toLowerCase().contains(constraint.toString().toLowerCase())) {
                        searchResults.add(item);
                    }
                }

                results.count = searchResults.size();
                results.values = searchResults;
            } else {
                mItems = (ArrayList) mPetitionsTableDbAdapter.getPetitionsForType(DatabaseHelper.PETITION_TYPE_ALL);
                results.count = mItems.size();
                results.values = mItems;
            }


            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            mItems = (List<ItemPetitionsTable>) results.values;
            notifyDataSetChanged();
        }
    }

Upvotes: 0

Views: 577

Answers (1)

create one more method in your adapter such as ViewPagerPetitionsRecyclerViewAdapter. Using that method update the date in your adapter and then call notifyDataSetChanged()

sample code

     private void getDataFromDatabase() {

    if (Const.DEBUGGING)
        Log.d(Const.DEBUG, "getDataFromDatabase()");

    if (mSwipeRefreshLayout.isRefreshing())
        mSwipeRefreshLayout.setRefreshing(false);

    mAlVerified = mPetitionsTableDbAdapter.getPetitionsForType(DatabaseHelper.PETITION_TYPE_ALL);
    Log.d(Const.DEBUG, "List Size: " + mAlVerified.size());
   // u need to update data here
     mViewPagerPetitionsRecyclerViewAdapter.updatedata(mAlVerified);

    mViewPagerPetitionsRecyclerViewAdapter.notifyDataSetChanged();

    isRefreshing = false;
}

Upvotes: 1

Related Questions