项目已从ArrayList中删除,但notifyDataSetChanged()仅删除底部项目

时间:2017-10-19 07:55:17

标签: java android arraylist android-recyclerview

我有一个回收站视图,带有来自自定义对象的ArrayList。 每行都有一个删除按钮,单击该项时将从recyclerview中删除。 现在删除按钮工作,并从arraylist中删除正确的项目,但是当项目再次显示在列表中时,只删除底部项目,并且从列表中真正删除的项目保留在那里。

它真的很奇怪,我无法弄清楚为什么?

我管理活动中已删除的项目,这是活动的代码:

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


            }
        }

由于

1 个答案:

答案 0 :(得分:3)

试试这个。!

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