Mon RecyclERView est une duplication des articles lorsque je le roule et j'appelle déjà adapter.notifyDataSetChanged()
.
Donc, probablement je appelais la mise à jour des données sur le mauvais endroit, mais je ne trouve pas comment ça fonctionne.
Voici un 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;
}
Voici mon adaptateur:
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();
}
});
}
}
}
Dans l'image ci-dessous, vous pouvez voir que les boutons radio sont dupliqués et il y a un espace vide supplémentaire dans toutes les lignes. J'ai vu beaucoup de questions ici et dans un autre forum à ce sujet, mais ce n'est pas clair pour moi où appeler ce jeu de données de mise à jour.
Je ne suis pas avancé Android Developer, donc si vous pouvez expliquer, ce sera plus facile pour moi.
Edition 1
Classe de la liste de contrôle:
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
Code de l'adaptateur mis à jour
Vous devez juste appeler list.clear();
avant d'insérer dans RecyclerViewAdapter
. puis appelez après appel adapter.notifyDatasetChange()
au lieu de
List<Checklist> modelList = new ArrayList<>();
recyclerViewAdapter = new ChecklistAdapter(modelList,this);
modelList = getPackages();
recyclerViewAdapter = new ChecklistAdapter(modelList,this);
packageRecyclerView.setAdapter(recyclerViewAdapter);
tilisez-le comme ça
recyclerViewAdapter = new ChecklistAdapter(getPackages(),this);
packageRecyclerView.setAdapter(recyclerViewAdapter);
et modifier la méthode getPackages comme
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));
}
return modelList;
}
J'espère que ceci vous aidera.
modifier votre liste de contrôle ...
public class Checklist {
String title;
List<String> questions;
boolean isRadioButtonAdded;
public Checklist(String title, List<String> questions) {
this.title = title;
this.questions = questions;
}
public boolean getIsAdded(){
return isRadioButtonAdded;
}
public void setIsAdded(boolean isAdded){
this.isRadioButtonAdded = isAdded;
}
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;
}
et modifier votre ONBindViewholder
@Override
public void onBindViewHolder(ChecklistAdapter.ViewHolder holder,
int position) {
Checklist packageModel = packageList.get(position);
holder.packageName.setText(packageModel.getTitle());
int id = (position+1)*100;
if(!packageModel.getIsAdded){
for(String price : packageModel.getQuestions()){
RadioButton rb = new RadioButton(ChecklistAdapter.this.context);
rb.setId(id++);
rb.setText(price);
holder.priceGroup.addView(rb);
packageModel.setIsAdded(true)
}
}
}
Je pense que cela résout votre problème. codage heureux