what is notifyItemRangeChanged(0, this.data.size()); In this example, how does it work?
I
understand how viewHolder’s onBindViewHolder
works, but I don’t know how
notifyItemRangeChanged(0, this.data.size());
How it works in this example and what it does.
The data provided to this adapter is in JSON format.
The adapters are as follows:
public class AdapterQuestion extends RecyclerView.Adapter<AdapterQuestion.ViewQuestion>{
private LayoutInflater mLayoutInflater;
this is an arrayList of questionData objects
private ArrayList<QuestionData> data =new ArrayList<>();
Created the layoutInflator
public AdapterQuestion(Context context){
get from context
mLayoutInflater=LayoutInflater.from(context);
}
public void setBloglist(ArrayList<QuestionData> data){
this.data =data;
notifyItemRangeChanged(0, this.data.size());
}
@Override
public ViewQuestion onCreateViewHolder(ViewGroup parent, int viewType) {
inflates the customQuestion view or converts it to java code
View view= mLayoutInflater.inflate(R.layout.customquestion, null);
We now want to convert the View into a ViewQuestion, view Question takes
a view so we pass the view into view question and then return it.
ViewQuestion holder=new ViewQuestion(view);
return holder;
}
ViewGroup parent and ViewType are not being assigned.
@Override
public void onBindViewHolder(ViewQuestion holder, int position) {
here we need to bind the data to our view, there is currently no Data!
We need to get the data from our JSON
Parameters is a ViewHolder and a Position
This gives us the current information object from the whole arraylist
data.get(position) data is the arraylist and we are getting the current position or index;
That current obj is of Type QuestionData
QuestionData currentObj= data.get(position);
we are accessing the Inflated view, or saved view with holder
holder.answerText is the textView in holder. We are then taking that current object
We are getting the text of the current object and setting it to the AnswerText view
holder.answerText.setText(currentObj.getMtext());
holder.answerId.setText(currentObj.getId());
holder.mVotes.setText(currentObj.getVotes());
holder.mLikeButton.setTag(currentObj);
}
@Override
public int getItemCount() {
return data.size();
}
public class ViewQuestion extends RecyclerView.ViewHolder{
once we create it once the reclycer view will automatically recycle it
private TextView answerText;
private TextView answerId;
private TextView mVotes;
private LikeButton mLikeButton;
public ViewQuestion (View itemView){
super(itemView);
here we are finding the views by their ID
answerText=(TextView)itemView.findViewById(R.id.answerText);
answerId=(TextView)itemView.findViewById(R.id.answerId);
mVotes=(TextView)itemView.findViewById(R.id.VoteTextView);
mLikeButton= (LikeButton)itemView.findViewById(R.id.heart_buttons);
mLikeButton.setOnLikeListener(new OnLikeListener() {
@Override
public void liked(LikeButton likeButton) {
Voting vote = new Voting();
vote.onUpVote(convertToString(),
getAdapterPosition(),ViewQuestion.this);
System.out.print("Adapter Position"+getAdapterPosition());
}
@Override
public void unLiked(LikeButton likeButton) {
Voting onDown=new Voting();
onDown.onDownVote(convertToString(),
getAdapterPosition(), ViewQuestion.this);
}
});
}
public String getVoteView(){
String voteView=mVotes.getText().toString();
return voteView;
}
public String convertToString(){
String converted=answerId.getText().toString();
return converted;
}
public int convertToInt(){
String converted=answerId.getText().toString();
int ConvertedInt=Integer.parseInt(converted);
return ConvertedInt;
}
}
}
Solution
When the data
to be set in the RecyclerView changes, the Adapter needs to be notified of the data change so that it can change the data > the Recycle Bin View.
Method
notifyItemRangedChanged(fromIndex,toIndex);
Used to notify the adapter that
some data set has changed throughout the data, it tells the adapter that the adapter should refresh the data and reload it into the recyclerView, starting with the fromIndex to toIndex of the incoming method.
Use this method if you have changed multiple but not all of the data, which is also in the cluster, so you can say that the data has changed from the 5th to the 10th index.
If all data changes the call:
notifyDataSetChanged();
If only one dataItem is changed, call:
notifyItemChanged(dataPosition);