Java 如何在Android中从ArrayList中删除项目

Java 如何在Android中从ArrayList中删除项目,java,android,android-recyclerview,android-adapter,Java,Android,Android Recyclerview,Android Adapter,在我的应用程序中,我将2个recyclerview合并到一个活动中 我想在一个recyclerview'中添加项目时,将此项目添加到另一个recyclerview`. 在2recyclerViews中,我使用界面将数据发送到活动 但是,当单击recyclerview中的项目时,会在Logcat中显示两个错误 活动代码: public class SuggestFilmActivity extends AppCompatActivity implements SuggestedListener,

在我的应用程序中,我将2个
recyclerview
合并到一个活动中
我想在一个
recyclerview'中添加项目时,将此项目添加到另一个
recyclerview`.

在2
recyclerViews
中,我使用
界面将数据发送到活动

但是,当单击
recyclerview
中的项目时,会在Logcat中显示两个错误

活动代码:

public class SuggestFilmActivity extends AppCompatActivity implements SuggestedListener, SuggestedDeleteListener {

    @BindView(R.id.toolbarTitleTxt)
    TextView toolbarTitleTxt;
    @BindView(R.id.suggestFilm_searchEditText)
    EditText suggestFilm_searchEditText;
    @BindView(R.id.suggestFilm_searchBtn)
    ImageView suggestFilm_searchBtn;
    @BindView(R.id.suggestFilm_clearBtn)
    ImageView suggestFilm_clearBtn;
    @BindView(R.id.suggestFilm_recyclerView)
    RecyclerView suggestFilm_recyclerView;
    @BindView(R.id.suggestFilm_recyclerViewProgress)
    ProgressBar suggestFilm_recyclerViewProgress;
    @BindView(R.id.suggestFilm_noDataText)
    TextView suggestFilm_noDataText;
    @BindView(R.id.newsPageLoadLay)
    RelativeLayout newsPageLoadLay;
    @BindView(R.id.suggestFilm_recyclerViewSendUser)
    RecyclerView suggestFilm_recyclerViewSendUser;
    @BindView(R.id.suggestFilm_buttonsSendCard)
    CardView suggestFilm_buttonsSendCard;
    private Context context;
    private SuggestFilmAdapter suggestFilmAdapter;
    private List<Result> model = new ArrayList<>();
    private ArrayList<SuggestFilmAddUser> suggestFilmAddUserList = new ArrayList<>();
    private SuggestFilmUserAdapter suggestFilmUserAdapter;
    private InterfaceApi api;
    private SharedPrefrencesHandler prefrencesHandler;
    private String token;
    private GridLayoutManager gridLayoutManager;
    private LinearLayoutManager linearLayoutManager;
    private List<Integer> usersListSend = new ArrayList<>();
    private SuggestFilmAddUser suggestFilmAddUser;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_suggest_film);
        //Initialize
        ButterKnife.bind(this);
        context = this;
        prefrencesHandler = new SharedPrefrencesHandler(context);
        api = ApiClient.getClient().create(InterfaceApi.class);
        suggestFilmAdapter = new SuggestFilmAdapter(context, model, this);
        gridLayoutManager = new GridLayoutManager(context, 3);
        linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        //Get token
        token = prefrencesHandler.getFromShared(SharedPrefrencesKeys.TOKEN.name());
        //Set toolbar title
        toolbarTitleTxt.setText(context.getResources().getString(R.string.SuggestToFollowers));
        //Init followers recyclerView
        suggestFilm_recyclerView.setLayoutManager(gridLayoutManager);
        suggestFilm_recyclerView.setHasFixedSize(true);
        //Init send user recyclerView
        suggestFilm_recyclerViewSendUser.setLayoutManager(linearLayoutManager);
        suggestFilm_recyclerViewSendUser.setHasFixedSize(true);
        //Init Send user adapter
        suggestFilmUserAdapter = new SuggestFilmUserAdapter(context, suggestFilmAddUserList, this);
        suggestFilm_recyclerViewSendUser.setAdapter(suggestFilmUserAdapter);
        //Load more
        newsPageLoadLay.setVisibility(View.GONE);
        suggestFilm_recyclerView.setOnScrollListener(new EndlessRecyclerGridPage1(gridLayoutManager) {
            @Override
            public void onLoadMore(int current_page) {

                newsPageLoadLay.setVisibility(View.VISIBLE);

                Call<SeriesWhoWatchedResponse> call = api.getSuggestFilmUsers(token, filmSendData("", 10, current_page));

                call.enqueue(new Callback<SeriesWhoWatchedResponse>() {
                    @Override
                    public void onResponse(Call<SeriesWhoWatchedResponse> call, Response<SeriesWhoWatchedResponse> response) {
                        if (response.body().getData() != null && response.body().getStatusCode() != 401
                                && response.body().getStatusCode() != 402) {
                            if (response.body().getData().getResult().size() > 0) {
                                suggestFilmAdapter.addNewItem(response.body().getData().getResult());
                                //Gone no explore
                                newsPageLoadLay.setVisibility(View.GONE);
                            }
                        } else {
                            prefrencesHandler.remove(SharedPrefrencesKeys.TOKEN.name());
                            startActivity(new Intent(context, LoginActivity.class));
                        }

                        newsPageLoadLay.setVisibility(View.GONE);
                    }

                    @Override
                    public void onFailure(Call<SeriesWhoWatchedResponse> call, Throwable t) {
                        newsPageLoadLay.setVisibility(View.GONE);
                    }
                });
            }
        });
        //Get user data
        getUserData("", 1);
    }

    private void getUserData(String search, int page) {
        suggestFilm_recyclerViewProgress.setVisibility(View.VISIBLE);
        Call<SeriesWhoWatchedResponse> call = api.getSuggestFilmUsers(token, filmSendData(search, 10, page));
        call.enqueue(new Callback<SeriesWhoWatchedResponse>() {
            @Override
            public void onResponse(Call<SeriesWhoWatchedResponse> call, Response<SeriesWhoWatchedResponse> response) {
                if (response.body().getData() != null) {
                    if (response.body().getData().getResult().size() > 0) {
                        model.clear();
                        model.addAll(response.body().getData().getResult());
                        suggestFilmAdapter.notifyDataSetChanged();
                        suggestFilm_recyclerView.setAdapter(suggestFilmAdapter);
                        suggestFilm_noDataText.setText("");
                    } else {
                        model.clear();
                        suggestFilmAdapter.notifyDataSetChanged();
                        suggestFilm_recyclerView.setAdapter(suggestFilmAdapter);
                        suggestFilm_noDataText.setText(context.getResources().getString(R.string.noFollowersYet));
                    }
                }
                suggestFilm_recyclerViewProgress.setVisibility(View.GONE);
            }

            @Override
            public void onFailure(Call<SeriesWhoWatchedResponse> call, Throwable t) {
                suggestFilm_recyclerViewProgress.setVisibility(View.GONE);
            }
        });
    }

    private SuggestFilmSendData filmSendData(String search, int size, int page) {
        SuggestFilmSendData sendData = new SuggestFilmSendData();
        sendData.setKeyword(search);
        sendData.setPageIndex(page);
        sendData.setPageSize(size);

        return sendData;
    }

    @Override
    public void onSend(int Id, String name, String image) {
        suggestFilmAddUser = new SuggestFilmAddUser();
        suggestFilmAddUser.setId(Id);
        suggestFilmAddUser.setName(name);
        suggestFilmAddUser.setImage(image);
        //Add to list only once item
        for (SuggestFilmAddUser idList : suggestFilmAddUserList) {
            if (idList.getId() == suggestFilmAddUser.getId()) {
                return;
            }
        }
        suggestFilmAddUserList.add(suggestFilmAddUser);
        if (suggestFilmAddUserList.size() > 0) {
            suggestFilm_buttonsSendCard.setCardBackgroundColor(ContextCompat.getColor(context, R.color.colorAccent));
            suggestFilm_buttonsSendCard.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    getSuggestList();
                }
            });
        }
        suggestFilmUserAdapter.notifyItemInserted(suggestFilmAddUserList.size() - 1);
        suggestFilm_recyclerViewSendUser.setVisibility(View.VISIBLE);

        for (SuggestFilmAddUser suggest : suggestFilmAddUserList) {
            if (suggest.getId() == suggestFilmAddUser.getId()) {
                Log.e("SuggestLog", suggest.getId() + "");
                usersListSend.add(suggest.getId());
                return;
            }
        }
    }

    @Override
    public void onDelete(int Id) {
        if (usersListSend.size() > 0) {
            usersListSend.remove(Id);
        }

        Toast.makeText(context, "" + Id, Toast.LENGTH_SHORT).show();
    }

    private void getSuggestList() {
        for (SuggestFilmAddUser suggest : suggestFilmAddUserList) {
            if (suggest.getId() == suggestFilmAddUser.getId()) {
                Toast.makeText(context, "" + usersListSend, Toast.LENGTH_SHORT).show();
                return;
            }
        }
    }
public class SuggestFilmAdapter extends RecyclerView.Adapter<SuggestFilmAdapter.ViewHolder> {

    private Context context;
    private List<Result> model;
    private SuggestedListener suggestedListener;

    public SuggestFilmAdapter(Context context, List<Result> model, SuggestedListener suggestedListener) {
        this.context = context;
        this.model = model;
        this.suggestedListener = suggestedListener;
    }

    @Override
    public SuggestFilmAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_suggest_film_users_followers, parent, false);

        return new SuggestFilmAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final SuggestFilmAdapter.ViewHolder holder, final int position) {
        //Name
        holder.row_suggestFilmProfileName.setText(model.get(position).getName());
        //Image
        Glide.with(context)
                .load(model.get(position).getImageUrl())
                .asBitmap()
                .placeholder(R.drawable.default_image)
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .override(300, 300)
                .into(new BitmapImageViewTarget(holder.row_suggestFilmProfileImage) {
                    @Override
                    protected void setResource(Bitmap resource) {
                        if (context == null) return;

                        RoundedBitmapDrawable circularBitmapDrawable =
                                RoundedBitmapDrawableFactory.create(context.getResources(), resource);
                        circularBitmapDrawable.setCircular(true);
                        holder.row_suggestFilmProfileImage.setImageDrawable(circularBitmapDrawable);
                    }
                });
        //Is Mutual
        if (model.get(position).getIsMutual()) {
            holder.row_suggestFilmIsOk.setVisibility(View.VISIBLE);
        } else {
            holder.row_suggestFilmIsOk.setVisibility(View.GONE);
        }
        holder.row_suggestedLay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                suggestedListener.onSend(model.get(position).getUserId(),
                        model.get(position).getName(),
                        model.get(position).getImageUrl());
            }
        });
    }

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

    public void addNewItem(List<Result> newContent) {
        int start = this.model.size();
        int end = newContent.size();
        model.addAll(newContent);
        notifyDataSetChanged();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private ImageView row_suggestFilmProfileImage, row_suggestFilmIsOk;
        private TextView row_suggestFilmProfileName;
        private RelativeLayout row_suggestedLay;

        public ViewHolder(View itemView) {
            super(itemView);

            row_suggestFilmProfileImage = (ImageView) itemView.findViewById(R.id.row_suggestFilmProfileImage);
            row_suggestFilmIsOk = (ImageView) itemView.findViewById(R.id.row_suggestFilmIsOk);
            row_suggestFilmProfileName = (TextView) itemView.findViewById(R.id.row_suggestFilmProfileName);
            row_suggestedLay = (RelativeLayout) itemView.findViewById(R.id.row_suggestedLay);
        }
    }
}
在onDelete中显示此行的错误:

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

    private Context context;
    private ArrayList<SuggestFilmAddUser> model;
    private SuggestedDeleteListener deleteListener;

    public SuggestFilmUserAdapter(Context context, ArrayList<SuggestFilmAddUser> model, SuggestedDeleteListener deleteListener) {
        this.context = context;
        this.model = model;
        this.deleteListener = deleteListener;
    }

    @Override
    public SuggestFilmUserAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_suggest_film_users_add, parent, false);

        return new SuggestFilmUserAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final SuggestFilmUserAdapter.ViewHolder holder, final int position) {
        //Name
        holder.rowSuggestAddUser_name.setText(model.get(position).getName());
        //Image
        Glide.with(context)
                .load(model.get(position).getImage())
                .asBitmap()
                .placeholder(R.drawable.default_image)
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .override(300, 300)
                .into(new BitmapImageViewTarget(holder.rowSuggestAddUser_image) {
                    @Override
                    protected void setResource(Bitmap resource) {
                        if (context == null) return;

                        RoundedBitmapDrawable circularBitmapDrawable =
                                RoundedBitmapDrawableFactory.create(context.getResources(), resource);
                        circularBitmapDrawable.setCircular(true);
                        holder.rowSuggestAddUser_image.setImageDrawable(circularBitmapDrawable);
                    }
                });
        //Cancel btn
        holder.rowSuggestAddUser_cancelImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                deleteItem(position);
                deleteListener.onDelete(model.get(position).getId());
            }
        });
    }

    private void deleteItem(int position) {
        model.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, model.size());
    }

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

    public void addNewItem(ArrayList<SuggestFilmAddUser> newContent) {
        int start = this.model.size();
        int end = newContent.size();
        model.addAll(newContent);
        notifyDataSetChanged();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private ImageView rowSuggestAddUser_image, rowSuggestAddUser_cancelImage;
        private TextView rowSuggestAddUser_name;
        private RelativeLayout rowSuggestAddUser_lay;

        public ViewHolder(View itemView) {
            super(itemView);

            rowSuggestAddUser_image = (ImageView) itemView.findViewById(R.id.rowSuggestAddUser_image);
            rowSuggestAddUser_cancelImage = (ImageView) itemView.findViewById(R.id.rowSuggestAddUser_cancelImage);
            rowSuggestAddUser_name = (TextView) itemView.findViewById(R.id.rowSuggestAddUser_name);
            rowSuggestAddUser_lay = (RelativeLayout) itemView.findViewById(R.id.rowSuggestAddUser_lay);
        }
    }
}
FATAL EXCEPTION: main
Process: com.app.test, PID: 28516
java.lang.IndexOutOfBoundsException: Invalid index 18, size is 2
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.remove(ArrayList.java:403)
at com.app.test.Activities.SuggestFilmActivity.onDelete(SuggestFilmActivity.java:222)
at com.app.test.Adapters.SuggestFilm.SuggestFilmUserAdapter$2.onClick(SuggestFilmUserAdapter.java:76)
at android.view.View.performClick(View.java:4764)
at android.view.View$PerformClick.run(View.java:19844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
usersListSend.remove(Id);

请帮帮我,我是业余爱好者,真的需要这个帮助。请谢谢,最简单的解决方案是将您的
Id
存储为
String
ArrayList
中,但我建议您根据异常消息阅读更多关于和的信息:

java.lang.IndexOutOfBoundsException:索引18无效,大小为2 位于java.util.ArrayList.ThrowindexOutfBoundsException(ArrayList.java:255) 在java.util.ArrayList.remove处(ArrayList.java:403) 位于com.app.test.Activities.SuggestFilmActivity.onDelete(SuggestFilmActivity.java:222)

您正在删除ArrayList中索引为18、大小为2的元素。这个异常发生在第222行SuggestFilmActivity类中的onDelete方法中。因此,根据您的代码,我们有:

public void onDelete(int Id) {
    if (usersListSend.size() > 0) {
        usersListSend.remove(Id);
    }

    Toast.makeText(context, "" + Id, Toast.LENGTH_SHORT).show();
}    
要解决此问题,我建议执行以下操作:

public void onDelete(int id) {
    if (id > -1 && id < usersListSend.size()) {
        usersListSend.remove(id);
    }

    Toast.makeText(context, "" + id, Toast.LENGTH_SHORT).show();
}
对于这一点:

//Cancel btn
holder.rowSuggestAddUser_cancelImage.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        int id = model.get(position).getId();
        deleteItem(position);
        deleteListener.onDelete(id);
    }
});
并修改此方法:

private void deleteItem(int position) {
    model.remove(position);
    notifyItemRemoved(position);
    //notifyItemRangeChanged(position, model.size()); // you notified already and no need to do it again I think
}
通过方法void onDelete(int-ID)中SuggestFilmActivity类中的ID删除SuggestFilmAddUser:


将int替换为整数

public void onDelete(Integer Id) {
if (usersListSend.size() > 0) {
    usersListSend.remove(Id);
}

Toast.makeText(context, "" + Id, Toast.LENGTH_SHORT).show(); } 

错误显示为
IndexOutOfBounds
,因此您显然给出了一个错误的索引值,因此
OnBindViewHolder
中给定的位置肯定不是您要查找的位置@JoachimHuet,你能帮我修复这个错误吗?求你了,我的兄弟。真的需要你的帮助为什么传递ID来代替位置deleteListener.onDelete(model.get(position.getId())@ArbazRizvi,我想当用户单击deleteAdapter时,从这个列表中删除用户。为此,我用接口发送ID。你能帮我吗?usersListSend.remove(Id);这是通行证而不是身份证。你能帮我查一下密码吗?请我是业余爱好者,真的需要你的帮助。请回答这个错误。你应该读一下,你能解释一下为什么ans是错误的吗??我会非常感谢你的。。。。首先,您不必将int原语转换为包装对象整数,编译器将执行取消装箱和自动装箱。因此,List=newarraylist();增加第(1)款;增加(2);没关系。其次,如果您查看列表接口的源代码,您将看到声明如下的remove方法:E remove(int index);第三,您的代码没有解决这个问题,还需要查看重载方法:booleanremove(objecto);我建议你做个实验。创建任何类,比如消息。创建消息列表:list messages=new ArrayList();。将多个值添加到消息列表中。并尝试从该列表中删除任何项:messages.remove(1);删除(Integer.valueOf(1));看看结果!您将得到答案,为什么您的解决方案是错误的!嘿,你在这里吗,我亲爱的朋友?如果你在这里,请告诉我。请谢谢如果你看到这个消息,请回答我你的问题是什么?我将尝试回答他们我的朋友你看到我的消息了吗?嘿,我的朋友,你的回答帮助我,但告诉我奇怪的错误!你能用TeamViewer连接到我的电脑上看吗?请
@Override
public void onDelete(int Id) {
    if (usersListSend.size() > 0) usersListSend.remove(Integer.valueOf(Id)); // removing by Integer value not index!
    Toast.makeText(context, "" + Id, Toast.LENGTH_SHORT).show();
}
public void onDelete(Integer Id) {
if (usersListSend.size() > 0) {
    usersListSend.remove(Id);
}

Toast.makeText(context, "" + Id, Toast.LENGTH_SHORT).show(); }