问题是这样的: 我有一个片段,其中包含卡片的回收者视图,这些卡片是使用来自FireBase的信息动态生成的,每张卡片都有一个附加的删除按钮,我要做的就是在单击删除按钮时刷新片段卡内以显示剩余的卡。问题是该按钮位于我的名为AdapterServices的适配器的内部,我不知道如何访问该片段以对其执行atach或分离操作。很抱歉这个愚蠢的问题,我是Android开发的新手,对此我真的很坚持。 这是AdapterServices的代码:
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) {
}
});
}
}
这是属于我的适配器AdapterServices的btnDeleteServices的oncilick侦听器的更新代码,我决定包括从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();