我正在创建一个Android应用程序,每次单击该项目时,都会检索通过意图发送的数据。

我通过意图发送检索到的数据(这是我每次单击项目时都会检索的子集合),并且所有数据都接收到数组列表中,因此侦听器不知道数组列表中是否存在相同的数据,因为数据在另一个活动中。

当我第一次单击数据时,ItemMarkerActivity中正常显示的数据,但是当我返回并再次单击同一项目时,我在回收器视图中再次看到数据加载,并添加到以前的相同数据中,我正在使用该技术删除onStop上的数据,但效果不理想,因为我需要关闭所有活动才能看到已删除数据,因此我试图通过intent发送CollectionReference,但我做不到。因此,我需要一种在结束活动后立即删除数据的方法,并且如果有人采用另一种方法来解决此问题,那会更好。

提前致谢

adapter.setOnItemClickListener(new MarketAdapterRecyclerView.OnItemClickListener() {
    @Override
    public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
        CollectionReference path = documentSnapshot.getReference().collection("ShoppingItems");
        listener = path.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    return;
                }

                for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
                    if (dc.getType() == DocumentChange.Type.ADDED) {
                        item = dc.getDocument().toObject(Item.class);
                        itemList.add(item);
                    }
                }

                Intent intent = new Intent (shoppingActivity.this, ItemMarkerActivity.class);
                Log.v(TAG,"###################################" + itemList.toString());
                intent.putExtra("keyName", itemList);
                startActivity(intent);
            }
        });
    }
}



The Activity That Receives The data

The Manifest

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> implements Parcelable{

    public ArrayList<Item> ItemList;
    public Context mContext;
    private onMallListener mOnMallListener;





    private static final int NO_POSITION = -1;

    public ItemAdapter(ArrayList<Item> ItemList, Context mContext, onMallListener mOnMallListener) {

        this.ItemList = ItemList;
        this.mContext = mContext;
        this.mOnMallListener = mOnMallListener;



    }


    protected ItemAdapter(Parcel in) {
        ItemList = in.createTypedArrayList(Item.CREATOR);
    }

    public static final Creator<ItemAdapter> CREATOR = new Creator<ItemAdapter>() {
        @Override
        public ItemAdapter createFromParcel(Parcel in) {
            return new ItemAdapter(in);
        }

        @Override
        public ItemAdapter[] newArray(int size) {
            return new ItemAdapter[size];
        }
    };

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.activity_card_view_item, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view, mOnMallListener);

        return viewHolder;

    }


    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {

        Item item = ItemList.get(i);
        viewHolder.itemType.setText(ItemList.get(i).getItemType());
        Picasso.with(mContext)
                .load(item.getImageUrl())
                .fit()
                .centerCrop().into(viewHolder.imageUrl);



    }

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

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeTypedList(ItemList);
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener  {

        View mView;

        public TextView price;
        public TextView description;
        public TextView itemType;
        public ImageView imageUrl;
        onMallListener onMallListener;




        public ViewHolder(@NonNull View itemView, onMallListener mOnMallListener) {
            super(itemView);
            mView = itemView;

            itemType = (TextView) mView.findViewById(R.id.card_view_image_title);
            imageUrl = (ImageView) mView.findViewById(R.id.card_view_image);
            this.onMallListener = mOnMallListener;

            mView.setOnClickListener(this);





        }

        @Override
        public void onClick(View v) {
            if(mOnMallListener != null){
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION){
                    mOnMallListener.onMallClick(position);
                }

            }
        }


    }

    public interface onMallListener{
        void onMallClick(int position);

    }

}

最佳答案

在第一个活动中使用Room数据库保存数据,然后在第二个活动中检索数据。
在代码的任何位置(以及任何活动的回调中),您都可以清除db以及侦听此数据的所有列表/回收器。

https://developer.android.com/training/data-storage/room

希望对你有帮助

10-07 18:54
查看更多