簡體   English   中英

在 RecyclerView 中刪除項目只工作一次

[英]Delete item in RecyclerView works only once

當我從 RecyclerView 中刪除一個項目時,我無法再刪除另一個項目。 當我制作一個項目時,我也無法刪除該項目和 RecyclerView 中的任何其他項目。

下面是代碼。

Home.java :

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

        itemImage = findViewById(R.id.image_holder);
        itemName = findViewById(R.id.add_item_name);
        itemPrice = findViewById(R.id.add_price);
        itemDesc = findViewById(R.id.add_desc);

        // Initialize Firebase Auth
        mAuth = FirebaseAuth.getInstance();

        addPhotoButton = findViewById(R.id.getCameraBtn);
        addFileButton = findViewById(R.id.getGalleryBtn);

        imageView = findViewById(R.id.image_holder);

        addPhotoButton.setOnClickListener(this);
        addFileButton.setOnClickListener(this);

        itemList = new ArrayList<Item>();

        // add item for testing
        itemList.add(new Item(R.drawable.ic_logo, "Baby Stroller", "A stroller for baby", "59.99"));

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(this);
        adapter = new ItemAdapter(itemList);


        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);

        adapter.setOnItemClickListener(new ItemAdapter.OnItemClickListener() {
            @Override
            public void onDeleteClick(int position) {
                removeItem(position);
            }

            @Override
            public void onEditClick(int position) {
                editItem(position);
            }
        });
    }

    // log out back to start page
    public void goToStart(View view){
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {

            case R.id.getCameraBtn:
                //post a photo from the camera
                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(takePictureIntent, CAMERA_CODE);

                break;

            case R.id.getGalleryBtn:
                //post an image

                Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
                galleryIntent.setType("image/*"); //anything that is image related
                startActivityForResult(galleryIntent, GALLERY_CODE);

                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == GALLERY_CODE && resultCode == RESULT_OK) {
            if (data != null) {
                imageUri = data.getData(); //we have the actual path
                imageView.setImageURI(imageUri); //show image

            }
        } else if (requestCode == CAMERA_CODE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            imageView.setImageBitmap(imageBitmap);
        }
    }

    public void addItem(View view){
        if(itemName.getText().toString().trim().length() != 0 || itemPrice.getText().toString().trim().length() != 0 || itemDesc.getText().toString().trim().length() != 0){
            itemList.add(new Item(R.drawable.ic_logo, itemName.getText().toString(), itemPrice.getText().toString(), itemDesc.getText().toString()));
            adapter = new ItemAdapter(itemList);
            recyclerView.setAdapter(adapter);

            itemName.setText("");
            itemPrice.setText("");
            itemDesc.setText("");

        }
        else{
            Toast.makeText(Home.this, "All fields must be filled when creating a new item.",
                    Toast.LENGTH_LONG).show();
        }

    }

    public void removeItem(int position){
        itemList.remove(position);
        adapter.notifyItemChanged(position);
    }

ItemAdapter.java

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

    private ArrayList<Item> ItemList;
    private OnItemClickListener Listener;

    public void setOnItemClickListener(OnItemClickListener listener) {Listener = listener;}

    public interface OnItemClickListener{
        void onDeleteClick(int position);
        
    }

    public static class ViewHolder extends RecyclerView.ViewHolder{
        public ImageView item_image;
        public TextView item_name;
        public TextView item_desc;
        public TextView item_price;

        public ImageView deleteBtn;
        public ImageView editBtn;

        public ViewHolder(@NonNull View itemView, OnItemClickListener listener) {
            super(itemView);

            item_image = itemView.findViewById(R.id.item_image);
            item_name = itemView.findViewById(R.id.item_name);
            item_desc = itemView.findViewById(R.id.desc);
            item_price = itemView.findViewById(R.id.price);

            deleteBtn = itemView.findViewById(R.id.delete_item);
            editBtn = itemView.findViewById(R.id.edit_item);

            deleteBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(listener != null){
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION){
                            listener.onDeleteClick(position);
                        }
                    }
                }
            });

            
        }
    }

    public ItemAdapter(ArrayList<Item> itemList) {ItemList = itemList;}

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

        return vh;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Item currentItem = ItemList.get(position);
        holder.item_image.setImageResource(currentItem.getItemImage());
        holder.item_name.setText(currentItem.getItemName());
        holder.item_desc.setText(currentItem.getItemDesc());
        holder.item_price.setText(currentItem.getItemPrice());
    }

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

}

Item.java

    public class Item {
    private int itemImage;
    private String itemName;
    private String itemDesc;
    private String itemPrice;

    public Item(int itemImage, String itemName, String itemDesc, String itemPrice){
        this.itemImage = itemImage;
        this.itemName = itemName;
        this.itemDesc = itemDesc;
        this.itemPrice = itemPrice;
    }

    public int getItemImage(){return itemImage;}

    public String getItemName(){return itemName;}

    public String getItemDesc(){return itemDesc;}

    public String getItemPrice(){return itemPrice;}

}

當用戶單擊刪除按鈕時,它將第一次工作並刪除該特定項目,但是當需要刪除另一個項目時,該按鈕沒有響應。 當用戶添加項目但無法刪除任何項目時,也會發生同樣的情況。 不太確定是什么原因造成的。 謝謝。

編輯:當我將項目硬編碼到 RecyclerView 中時,刪除 function 工作正常。 只有在添加新項目時,它才不再起作用,包括硬編碼項目。

Home.java中,您正在設置點擊監聽器:

adapter.setOnItemClickListener(new ItemAdapter.OnItemClickListener() {...}

addItem()中,您正在創建一個新的適配器:

adapter = new ItemAdapter(itemList);

問題是您從未在這個新適配器上設置點擊監聽器。

我會考慮不創建新的適配器,而是調用通知方法來提醒適配器有新項目。

嘗試改變adapter.notifyItemChanged(position); adapter.notifyItemRemoved(position);

您是在告訴適配器一項已更改,而不是使用:

notifyDataSetChanged()

這應該重新加載所有項目

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM