繁体   English   中英

每当我想删除 RecyclerView 项目时出现 IndexOutOfBoundsException

[英]IndexOutOfBoundsException whenever I want to delete an RecyclerView item

我设法用 RecyclerView 制作了一个列表,现在我想通过单击该行来删除该行。 但是当我点击它时,没有任何反应,当我再次点击时,我得到了IndexOutOfBoundsException

我正在努力寻找例外......

这是我的MainActivity.class

MyRecyclerViewAdapter adapter;
    ArrayList<ExampleItem> movieList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // data to populate the RecyclerView with
        movieList = new ArrayList<>();
        movieList.add(new ExampleItem("Dr. No", "1962", "Sean Connery"));
        movieList.add(new ExampleItem("From Russia with Love", "1963", "Sean Connery"));
        movieList.add(new ExampleItem("Goldfinger", "1964", "Sean Connery"));
        movieList.add(new ExampleItem("Thunderball", "1965", "Sean Connery"));
        movieList.add(new ExampleItem("You Only Live Twice", "1967", "Sean Connery"));

        RecyclerView recyclerView = findViewById(R.id.homeRecyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new MyRecyclerViewAdapter(this, movieList);
        adapter.setClickListener(this); //MyRecyclerViewAdapter.ItemClickListener muss implementiert!
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onItemClick(View view, int position) {
        movieList.remove(position);
    }

这是我的适配器 class(我缩短了代码)

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

    private List<ExampleItem> mList;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    // data is passed into the constructor
    MyRecyclerViewAdapter(Context context, List<ExampleItem> data) { 
        this.mInflater = LayoutInflater.from(context);
        this.mList = data; //List is passed and is set into the variable above
    }

    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_items, parent, false);
        return new ViewHolder(view);
    }

    // binds the data to the TextView in each row
    @Override //Pass the value with this method:
    public void onBindViewHolder(ViewHolder holder, int position) {
        ExampleItem currentItem = mList.get(position);

        holder.titleView.setText(currentItem.getText1());
        holder.yearView.setText(currentItem.getText2());
        holder.actorView.setText(currentItem.getText3());
    }

    // total number of rows
    @Override
    public int getItemCount() {
        return mList.size(); 
    }

    //RecyclerView.ViewHolder
    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public final View mView;
        TextView titleView;
        TextView yearView;
        TextView actorView;

        ViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
            titleView = itemView.findViewById(R.id.title);
            yearView = itemView.findViewById(R.id.year);
            actorView = itemView.findViewById(R.id.actor);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    // allows clicks events to be caught
    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener { 
        void onItemClick(View view, int position);
    }
}

删除项目后是否必须更新列表?

代替:

@Override
public void onItemClick(View view, int position) {
    movieList.remove(position);
}

和:

@Override
public void onItemClick(View view, int position) {
    movieList.remove(position);
    adapter.notifyItemRemoved(position);
}

在 onClickListener 尝试添加

    adapter.notifyDataSetChanged();

notifyDataSetChanged 示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM