2017-10-19 130 views
1

我有一個回收站視圖,其中包含自定義對象的ArrayList。 每一行都有一個刪除按鈕,點擊後該項目將從回收站中刪除。 現在刪除按鈕起作用,並從數組列表中刪除正確的項目,但是當項目再次顯示在列表中時,只有最下面的項目被刪除,並且真正從列表中刪除的項目停留在那裏。從ArrayList中刪除的項目,但notifyDataSetChanged()僅刪除底部項目

它真的很奇怪,我不明白爲什麼?

我從活動管理刪除的項目,這裏是活動的代碼:

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)); 



} 

這裏是適配器:

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()); 


      } 
     } 

感謝

回答

3

試試這個!

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

謝謝。工作恰到好處 – RJB

+0

@RJB歡迎接受這個答案。 –