Reputation: 11109
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
Reputation: 396
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