My recyclerview is duplicating items when I roll it and I'm already calling adapter.notifyDataSetChanged()
.
So, probably I'm calling data set update at wrong place, but I can't find how it works.
Here is some code:
RecyclerView packageRecyclerView;
Intent intent;
ChecklistAdapter recyclerViewAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_checklist);
intent = getIntent();
size = intent.getIntExtra("size", 0);
Log.d(TAG, "onCreate - Qtd Questões: " + size);
packageRecyclerView = findViewById(R.id.package_lst);
LinearLayoutManager recyclerLayoutManager = new LinearLayoutManager(this);
packageRecyclerView.setLayoutManager(recyclerLayoutManager);
DividerItemDecoration dividerItemDecoration =
new DividerItemDecoration(packageRecyclerView.getContext(),
recyclerLayoutManager.getOrientation());
packageRecyclerView.addItemDecoration(dividerItemDecoration);
List<Checklist> modelList = new ArrayList<>();
recyclerViewAdapter = new ChecklistAdapter(modelList,this);
modelList = getPackages();
recyclerViewAdapter = new ChecklistAdapter(modelList,this);
// recyclerViewAdapter = new ChecklistAdapter(getPackages(),this);
packageRecyclerView.setAdapter(recyclerViewAdapter);
}
private List<Checklist> getPackages() {
List<Checklist> modelList = new ArrayList<>();
Log.d(TAG, "getPackages: " + size);
for (int i=0; i<size;i++) {
List<String> priceList = new ArrayList<>();
priceList.add("Sim");
priceList.add("Não");
priceList.add("Não se Aplica");
modelList.add(new Checklist(intent.getStringExtra("q"+i), priceList));
}
recyclerViewAdapter.notifyDataSetChanged();
return modelList;
}
Here is my adapter:
public class ChecklistAdapter extends
RecyclerView.Adapter<ChecklistAdapter.ViewHolder> {
private List<Checklist> packageList;
private Context context;
public ChecklistAdapter(List<Checklist> packageListIn
, Context ctx) {
packageList = packageListIn;
context = ctx;
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@Override
public void setHasStableIds(boolean hasStableIds) {
super.setHasStableIds(hasStableIds);
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public ChecklistAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.rv_checklistlines, parent, false);
ChecklistAdapter.ViewHolder viewHolder =
new ChecklistAdapter.ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) {
super.onBindViewHolder(holder, position, payloads);
}
@Override
public void onBindViewHolder(ChecklistAdapter.ViewHolder holder,
int position) {
Checklist packageModel = packageList.get(position);
holder.packageName.setText(packageModel.getTitle());
int id = (position+1)*100;
for(String price : packageModel.getQuestions()){
RadioButton rb = new RadioButton(ChecklistAdapter.this.context);
rb.setId(id++);
rb.setText(price);
holder.priceGroup.addView(rb);
}
}
@Override
public int getItemCount() {
return packageList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView packageName;
public RadioGroup priceGroup;
public ViewHolder(View view) {
super(view);
packageName = view.findViewById(R.id.package_name);
priceGroup = view.findViewById(R.id.price_grp);
priceGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
Toast.makeText(ChecklistAdapter.this.context,
"Radio button clicked " + radioGroup.getCheckedRadioButtonId(),
Toast.LENGTH_SHORT).show();
}
});
}
}
}
In the image below you can see that radio buttons are duplicated and there is some extra blank space in all rows. I saw many questions here and in another forums about this, but it's not clear to me where to call this update dataset.
I'm not an advanced Android developer, so if you can explain, it will be easier to me.
EDIT 1
Checklist class:
import java.util.List;
public class Checklist {
String title;
List<String> questions;
public Checklist(String title, List<String> questions) {
this.title = title;
this.questions = questions;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<String> getQuestions() {
return questions;
}
public void setQuestions(List<String> questions) {
this.questions = questions;
}
EDIT 2
Adapter Code updated
you have to setHasStableIds(true) to your Adapter in your activity.
and in your Adapter class you have to set below method. It may help you. it is work for me.
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public void setHasStableIds(boolean hasStableIds) {
super.setHasStableIds(hasStableIds);
}
you want like this?
You just need to call list.clear();
before insert into RecyclerViewAdapter
. then call after call adapter.notifyDatasetChange()
Put holder.setIsRecyclable(false) in onBindViewHolder() like below example.
@Override
public void onBindViewHolder(UsageStatVH holder, int position) {
holder.bindTo(list.get(position));
holder.setIsRecyclable(false);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With