【问题标题】:Item removed from ArrayList, but notifyDataSetChanged() only deletes the bottom item项从 ArrayList 中删除,但 notifyDataSetChanged() 仅删除底部项
【发布时间】:2018-03-31 05:02:36
【问题描述】:

我有一个回收器视图,其中包含来自自定义对象的 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());


            }
        }

谢谢

【问题讨论】:

    标签: java android arraylist android-recyclerview


    【解决方案1】:

    试试这个!

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

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多