2017-10-19 10 views
1

J'ai une vue recycleur, avec une ArrayList d'objets personnalisés. Chaque ligne possède un bouton de suppression, lorsque vous cliquez dessus, l'élément est supprimé de la vue de recyclage. Maintenant, le bouton de suppression fonctionne, et supprime l'élément correct de l'arraylist, cependant lorsque les éléments sont affichés à nouveau dans la liste, seul l'élément inférieur est supprimé, et l'élément qui a été réellement supprimé de la liste reste là.Élément retiré de ArrayList, mais notifyDataSetChanged() ne supprime que l'élément inférieur

C'est vraiment bizarre, et je n'arrive pas à comprendre pourquoi?

Je gère l'élément supprimé de l'activité, voici le code de l'activité:

public class ManageExerciseActivity extends AppCompatActivity { 

private static final String TAG = "999.OffLimitsActivity"; 
private RecyclerView exerciseRecyclerView; 
private ExerciseManageAdapter exerciseAdapter; 
public ArrayList<Exercise> exerciseList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_manage_exercise); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(ManageExerciseActivity.this, AddExerciseActivity.class); 
      startActivity(intent); 
     } 
    }); 


    fab.setImageBitmap(textAsBitmap("ADD", 40, Color.WHITE)); 


    exerciseList = new ArrayList<>(); 


     getSupportActionBar().setTitle("Manage my exercises"); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 


     exerciseRecyclerView = (RecyclerView) findViewById(R.id.exercise_manage_recycler_view); 
     exerciseAdapter = new ExerciseManageAdapter(exerciseList); 


     exerciseAdapter.setOnItemClickListener(new ExerciseManageAdapter.ClickListener() { 

      @Override 
      public void onItemClick(final int position, final View v) { 
       Log.d(TAG, "onItemClick pos = " + position); 

// custom dialog 
       AlertDialog.Builder builder = new AlertDialog.Builder(ManageExerciseActivity.this); 
       builder.setMessage("Do you wish to delete this exercise?") 
         .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
          String itemRemoved = exerciseList.get(position).getNameOfExercise(); 

          exerciseList.remove(position); 

          exerciseAdapter.notifyDataSetChanged(); 



          Snackbar.make(v, itemRemoved + " deleted", Snackbar.LENGTH_LONG) 
            .setAction("Undo", null).show(); 




         } 
        }) 
        .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          // User cancelled the dialog 
         } 
        }); 
      // Create the AlertDialog object and return it 
      builder.create(); 
      builder.show(); 

     } 
    }); 


    exerciseRecyclerView.setAdapter(exerciseAdapter); 
    exerciseRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 



} 

et voici l'adaptateur:

public class ExerciseManageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 


    private static ClickListener clickListener; 

    public ImageView exerciseItemIcon; 
    public TextView exerciseNameTextView; 
    public TextView exerciseDurationTextView; 
    public TextView exerciseTimesRemainingTextView; 
    public ImageView deleteImageView; 

    ArrayList<Exercise> exerciseArrayList = new ArrayList<>(); 

    public ExerciseManageAdapter(ArrayList<Exercise> exerciseArrayList) { 

     this.exerciseArrayList = exerciseArrayList; 

    } 


    public interface ClickListener { 
     void onItemClick(int position, View v); 
    } 


    class ExerciseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

     public ExerciseViewHolder(View view) { 
      super(view); 

//   view.setOnClickListener(this); 

      exerciseNameTextView = (TextView)view.findViewById(R.id.exercise_manage_name_textView); 
      exerciseDurationTextView = (TextView)view.findViewById(R.id.exercise_manage_duration_textview); 
      exerciseTimesRemainingTextView = (TextView)view.findViewById(R.id.exercise_manage_times_remaining); 
      exerciseItemIcon = (ImageView)view.findViewById(R.id.exercise_manage_item_icon); 
      deleteImageView = (ImageView)view.findViewById(R.id.delete_exercise_button); 

      deleteImageView.setOnClickListener(this); 
     } 




     @Override 
     public void onClick(View v) { 
      clickListener.onItemClick(getAdapterPosition(), v); 
     } 


    } 

    public void setOnItemClickListener(ClickListener clickListener) { 
     ExerciseManageAdapter.clickListener = clickListener; 
    } 

     @Override 
     public int getItemViewType(int position) { 

      return position; 
     } 

    @Override 
    public int getItemCount() { 
     return exerciseArrayList.size(); 
    } 

    @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 



      View itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.exercise_manage_item_row, parent, false); 



      return new ExerciseViewHolder(itemView); 

     } 




     @Override 
     public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 


      ExerciseViewHolder exerciseViewHolder = (ExerciseViewHolder) holder; 
      exerciseNameTextView.setText(exerciseArrayList.get(position).getNameOfExercise()); 
      exerciseDurationTextView.setText(exerciseArrayList.get(position).getDurationOfExercise()); 
      exerciseTimesRemainingTextView.setText(exerciseArrayList.get(position).getTimesPerWeek() + " times a week"); 
      exerciseItemIcon.setImageResource(exerciseArrayList.get(position).getExerciseIcon()); 


      } 
     } 

Merci

Répondre

3

essayer.!

notifyItemRemoved(position); 
notifyItemRangeChanged(position, mData.size()); 
+0

Merci. a bien travaillé – RJB

+0

@RJB Bienvenue acceptez cette réponse.! –