我是Android的新手。我的应用程序是使用回收器视图,而firebase发送触发更新以添加,编辑删除回收器视图中的复选框。
交互器从服务器中获取触发的更新,然后通过主持人在适配器中调用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);
}
当我使用迭代器时,它解决了我的问题。
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;
}
感谢Tomasz Czura的答案。