首页 > 解决方案 > 删除回收站视图的项目后如何刷新片段

问题描述

问题是这样的:我有一个片段,其中包含一个卡片的回收器视图,这些卡片是使用来自 FireBase 的信息动态生成的,每张卡片都有一个附加到自身的删除按钮,我想要做的只是刷新片段时我单击卡片内的删除按钮以显示剩余的卡片。问题是该按钮位于我的名为 AdapterServices 的适配器内,我不知道如何访问该片段以对其执行附加或分离操作。对于这个愚蠢的问题,我很抱歉,我是 Android 开发的新手,我真的很坚持。这是适配器服务的代码:

package com.store.adapters;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.RecyclerView;
import com.store.R;
import com.store.Servicios;
import com.store.famous.FragmentDeleteService;
import java.util.ArrayList;
import cn.pedant.SweetAlert.SweetAlertDialog;

public class AdapterServices extends RecyclerView.Adapter<AdapterServices.ViewHolderService> {
    private ArrayList<String> itemNames = new ArrayList<>();
    private ArrayList<String> itemPrices = new ArrayList<>();
    private ArrayList<String> itemDescriptions = new ArrayList<>();
    private ArrayList<String> itemMaximumTimes = new ArrayList<>();
    private Context context;
    private String stringContext;

    public AdapterServices(ArrayList<String> itemNames, ArrayList<String> itemPrices, ArrayList<String> itemDescriptions, ArrayList<String> itemMaximumTimes, Context context, String CONTEXT) {
        this.itemNames = itemNames;
        this.itemPrices = itemPrices;
        this.itemDescriptions = itemDescriptions;
        this.itemMaximumTimes = itemMaximumTimes;
        this.context = context;
        this.stringContext = CONTEXT;
    }

    @NonNull
    @Override
    public ViewHolderService onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        int id = 0;
        boolean hasCardOnClickAtached = false;
        boolean hasCardDeleteButton = false;
        if (stringContext.equals("view")) {
            id = R.layout.view_services_item;
        } else if(stringContext.equals("modal")){
            id = R.layout.service_item;
            hasCardOnClickAtached = true;
        } else {
            id = R.layout.delete_services_item;
            hasCardDeleteButton = true;
        }
        View view = LayoutInflater.from(parent.getContext()).inflate(id, parent, false);
        return new ViewHolderService(view, hasCardOnClickAtached, hasCardDeleteButton);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolderService holder, int position) {
        holder.serviceName.setText(itemNames.get(position));
        final String serviceName = holder.serviceName.getText().toString();
        holder.servicePrice.setText("$"+itemPrices.get(position));
        final String servicePrice = holder.servicePrice.getText().toString();
        holder.serviceDescription.setText(itemDescriptions.get(position));
        final String des = holder.serviceDescription.getText().toString();
        holder.serviceMaximumTime.setText(itemMaximumTimes.get(position) + " horas");
        final String maxTime = holder.serviceMaximumTime.getText().toString();
        if (holder.card != null) {
            holder.card.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context, Servicios.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.putExtra("name", serviceName);
                    intent.putExtra("price", servicePrice);
                    intent.putExtra("description", des);
                    intent.putExtra("maximum_hours", maxTime);
                    context.startActivity(intent);
                }
            });
        } else if(holder.btnDeleteService !=null){
            holder.btnDeleteService.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final View view = v;
                    new SweetAlertDialog(v.getContext(), SweetAlertDialog.WARNING_TYPE)
                            .setTitleText("¿Realmente deseas eliminar este servicio?")
                            .setContentText("Esta acción no se puede revertir")
                            .setConfirmText("Sí")
                            .setCancelText("No")
                            .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                                @Override
                                public void onClick(SweetAlertDialog sDialog) {

                                }
                            })
                            .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
                                @Override
                                public void onClick(SweetAlertDialog sweetAlertDialog) {

                                }
                            })
                            .show();

                }
            });
        }
    }


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

    public class ViewHolderService extends RecyclerView.ViewHolder {

        ImageView serviceImage;
        TextView serviceName;
        TextView servicePrice;
        TextView serviceDescription;
        TextView serviceMaximumTime;
        @Nullable CardView card;
        @Nullable Button btnDeleteService;
        @Nullable Button btnUpdateService;
        FrameLayout fl;

        public ViewHolderService(@NonNull View itemView, boolean hasCardOnClickAtached, boolean hasCardDeleteButton) {
            super(itemView);
            serviceImage = itemView.findViewById(R.id.item_image);
            serviceName = itemView.findViewById(R.id.item_name);
            servicePrice = itemView.findViewById(R.id.item_price);
            serviceDescription = itemView.findViewById(R.id.item_description);
            serviceMaximumTime = itemView.findViewById(R.id.item_maximum_time);
            card = null;
            btnDeleteService = null;
            btnUpdateService = null;
            if (hasCardOnClickAtached) {
                card = itemView.findViewById(R.id.item_card);
            } else if(hasCardDeleteButton) {
                btnDeleteService = itemView.findViewById(R.id.btnDeleteService);
                fl = itemView.findViewById(R.id.fl_del_ser);
            }
//            else {
//                // btnUpdateService = itemView.findViewById(R.id.btnDeleteService);
//            }
        }
    }
}

对不起,我忘了提供更多信息。这是我在 FragmentDeleteService 片段中的代码

package com.store.famous;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.store.R;
import com.store.SharedPreferencesApp;
import com.store.adapters.AdapterServices;

import java.util.ArrayList;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link FragmentDeleteService#newInstance} factory method to
 * create an instance of this fragment.
 */
public class FragmentDeleteService extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private String mParam1;
    private String mParam2;
    private RecyclerView recycler;
    private DatabaseReference reference;
    private SharedPreferencesApp preferencesApp;
    private String artistUserName;

    public FragmentDeleteService() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment FragmentDeleteService.
     */
    // TODO: Rename and change types and number of parameters
    public static FragmentDeleteService newInstance(String param1, String param2) {
        FragmentDeleteService fragment = new FragmentDeleteService();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_delete_service, container, false);
        fillData(view);
        return view;
    }

    private void fillData(View v){
        final View view = v;
        final ArrayList<String> itemNames = new ArrayList<>();
        final ArrayList<String> itemPrices = new ArrayList<>();
        final ArrayList<String> itemDescriptions = new ArrayList<>();
        final ArrayList<String> itemMaximumTimes = new ArrayList<>();
        final ArrayList<String> itemIds = new ArrayList<>();
        final String CONTEXT = "delete";
        preferencesApp = new SharedPreferencesApp(getContext());
        preferencesApp.loadPreferences();
        artistUserName = preferencesApp.getArtistUsername();
        reference = FirebaseDatabase.getInstance().getReference().child("data").child(artistUserName).child("servicios");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot element : dataSnapshot.getChildren()) {
                    itemNames.add(element.child("nombre").getValue().toString());
                    itemPrices.add(element.child("precio").getValue().toString());
                    itemDescriptions.add(element.child("detalles").getValue().toString());
                    itemMaximumTimes.add(element.child("tiempoMaximo").getValue().toString());
                    itemIds.add(element.getKey());
                }
                recycler = view.findViewById(R.id.recycler_delete_services);
                recycler.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
                AdapterServices adapter = new AdapterServices(itemNames, itemPrices, itemDescriptions, itemMaximumTimes, itemIds, getContext(), CONTEXT);
                recycler.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

这是我的 btnDeleteServices 的 oncilick 侦听器的更新代码,它属于我的名为 AdapterServices 的适配器,我决定包含从 RecyclerView 删除卡的方法,但正如我所说,回收器复制了剩余的项目,我非常使困惑

else if(holder.btnDeleteService !=null){
            holder.btnDeleteService.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final View view = v;
                    new SweetAlertDialog(v.getContext(), SweetAlertDialog.WARNING_TYPE)
                            .setTitleText("¿Realmente deseas eliminar este servicio?")
                            .setContentText("Esta acción no se puede revertir")
                            .setCancelText("No")
                            .setConfirmText("Sí")
                            .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                                @Override
                                public void onClick(SweetAlertDialog sDialog) {
                                    sDialog.dismissWithAnimation();
                                    String id = itemIds.get(pos);
                                    SharedPreferencesApp preferencesApp = new SharedPreferencesApp(context);
                                    preferencesApp.loadPreferences();
                                    String username = preferencesApp.getArtistUsername();
                                    itemNames.remove(pos);
                                    itemDescriptions.remove(pos);
                                    itemPrices.remove(pos);
                                    itemMaximumTimes.remove(pos);
                                    itemIds.remove(pos);
                                    DatabaseReference df = FirebaseDatabase.getInstance()
                                            .getReference("data")
                                            .child(username)
                                            .child("servicios")
                                            .child(id);
                                    df.addListenerForSingleValueEvent(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                                        }

                                        @Override
                                        public void onCancelled(@NonNull DatabaseError databaseError) {

                                        }
                                    });
                                    notifyDataSetChanged();
                                    Toast.makeText(context, "Eliminación satisfactoria", Toast.LENGTH_LONG).show();

标签: androidandroid-fragments

解决方案


推荐阅读