Android 从带有外部的回收器视图中移除

Android 从带有外部的回收器视图中移除,android,firebase,android-recyclerview,firebase-realtime-database,Android,Firebase,Android Recyclerview,Firebase Realtime Database,我是Android新手。我的应用程序正在利用Recycler视图,firebase会发送触发更新以添加、编辑和删除Recycler视图中的复选框 交互程序从服务器获取触发的更新,然后服务器通过presenter调用适配器中的addItem、UpdateItem或RemoveItem方法 我可以在“回收器”视图中添加、更新,但当我试图从“回收器”视图中删除项目时,我很难找到适配器的位置 通过迭代,我可以算出ArrayList的索引,但我不知道如何获得视图的位置来删除它 removeItem方法中的

我是Android新手。我的应用程序正在利用Recycler视图,firebase会发送触发更新以添加、编辑和删除Recycler视图中的复选框

交互程序从服务器获取触发的更新,然后服务器通过presenter调用适配器中的addItem、UpdateItem或RemoveItem方法

我可以在“回收器”视图中添加、更新,但当我试图从“回收器”视图中删除项目时,我很难找到适配器的位置

通过迭代,我可以算出ArrayList的索引,但我不知道如何获得视图的位置来删除它

removeItem方法中的以下代码可以很好地删除所需的视图,但也可以再次复制(添加)上一个视图。 我需要的是删除整个视图,而不添加重复的最后一个视图。我不知道如何获取
getadapterPosition()
,因为我没有处理像onClick这样的本地触发器

public class CustomShoppingRecyclerAdapter extends RecyclerView.Adapter<CustomShoppingRecyclerAdapter.ViewHolder> implements ShoppingAdapterView {
private final ArrayList<Shopping> mMessageList = new ArrayList<>();

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item, parent, false);
    vh= new ViewHolder(v);

    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    final Shopping current = mMessageList.get(position);

    holder.mShoppingItemCheckBox.setTag(current.getItem());
    holder.mShoppingItemCheckBox.setText(current.getItem());
    holder.mShoppingItemCheckBox.setChecked(current.getItemStatus());
    holder.mShoppingItemCheckBox.setOnClickListener(null);

    holder.mShoppingItemCheckBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    current.setItemStatus(holder.mShoppingItemCheckBox.isChecked());
                    presenter.updateItemToServer(current);
              tag=  (String) holder.mShoppingItemCheckBox.getTag();
            }
        });
}

@Override
public void removeItem(Shopping shopping) {
    Integer index = 0;

    for (Shopping _item : mMessageList) {
        index = mMessageList.indexOf(_item);

        if (_item.getItem().equals(shopping.getItem())) {
                if (index != -1) {
                    mMessageList.remove(index);
                    notifyItemRemoved(index);
                }
        }
    }
}

class ViewHolder extends RecyclerView.ViewHolder {
    private CheckBox mShoppingItemCheckBox;
    private TextView mMessageTextView;

     ViewHolder(View itemView) {
        super(itemView);

itemView.findViewById(R.id.shopping_author);
        mShoppingItemCheckBox = (CheckBox) itemView.findViewById(R.id.shopping_item);
    }
公共类CustomShoppingRecyclerAdapter扩展了RecyclerView。适配器实现ShoppingAdapterView{
private final ArrayList mMessageList=新ArrayList();
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.user_项,parent,false);
vh=新的视窗支架(v);
返回新的视图持有者(v);
}
@凌驾
公共无效onBindViewHolder(最终ViewHolder,内部位置){
最终购物电流=mMessageList.get(位置);
holder.mShoppingItemCheckBox.setTag(current.getItem());
holder.mShoppingItemCheckBox.setText(current.getItem());
holder.mShoppingItemCheckBox.setChecked(current.getItemStatus());
holder.mShoppingItemCheckBox.setOnClickListener(null);
holder.mShoppingItemCheckBox.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
current.setItemStatus(holder.mShoppingItemCheckBox.isChecked());
presenter.updateItemToServer(当前);
tag=(字符串)holder.mShoppingItemCheckBox.getTag();
}
});
}
@凌驾
公共无效清除项目(购物){
整数指数=0;
适用于(购物_项目:女传道人){
索引=mMessageList.indexOf(_项);
如果(_item.getItem().equals(shopping.getItem())){
如果(索引!=-1){
M消息传递者。移除(索引);
删除的项目(索引);
}
}
}
}
类ViewHolder扩展了RecyclerView.ViewHolder{
私有复选框mShoppingItemCheckBox;
私有文本视图mMessageTextView;
ViewHolder(视图项视图){
超级(项目视图);
findviewbyd(R.id.shopping\u作者);
mShoppingItemCheckBox=(CheckBox)itemviewbyd(R.id.shopping\u item);
}

当我使用迭代器时,它解决了我的问题

    Integer index = 0;
    Iterator<Shopping> it = mMessageList.iterator();
    while (it.hasNext()) {

        if (it.next().getItem().equals(shopping.getItem())) {
            it.remove();
            notifyItemRemoved(index);
            notifyItemRangeChanged(index, mMessageList.size());
            // If you know it's unique, you could `break;` here
        }
        index=index+1;
    }
整数索引=0;
迭代器it=mMessageList.Iterator();
while(it.hasNext()){
if(it.next().getItem().equals(shopping.getItem())){
it.remove();
删除的项目(索引);
notifyItemRangeChanged(索引,mMessageList.size());
//如果你知道它是独一无二的,你可以在这里打破它
}
指数=指数+1;
}

感谢Tomasz Czura的回答。

当我使用迭代器时,它解决了我的问题

    Integer index = 0;
    Iterator<Shopping> it = mMessageList.iterator();
    while (it.hasNext()) {

        if (it.next().getItem().equals(shopping.getItem())) {
            it.remove();
            notifyItemRemoved(index);
            notifyItemRangeChanged(index, mMessageList.size());
            // If you know it's unique, you could `break;` here
        }
        index=index+1;
    }
整数索引=0;
迭代器it=mMessageList.Iterator();
while(it.hasNext()){
if(it.next().getItem().equals(shopping.getItem())){
it.remove();
删除的项目(索引);
notifyItemRangeChanged(索引,mMessageList.size());
//如果你知道它是独一无二的,你可以在这里打破它
}
指数=指数+1;
}

感谢Tomasz Czura的回答。

您是否尝试使用迭代器并通过迭代器删除。删除()?我已更新了我的问题以使其更清楚。我需要根据从arraylist中删除的项删除视图。您是否尝试使用迭代器并通过迭代器删除。删除()?我已更新了我的问题以使其更清楚。我需要根据从arraylist中删除的项目删除视图。