package Adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.example.dis015.meetdax2danish.R;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import java.util.ArrayList;
import java.util.HashMap;
public class DifferentGenderServicesAdapter extends RecyclerView.Adapter {
private ArrayList<String> serviceId;
private String id, servicename,stylistid,strService,strServiceId;
private ArrayList<String> serviceArray = new ArrayList<>();
private ArrayList<Integer> costArray = new ArrayList<>();
private int serviceprice,categoryPosition,price,duration;
private ArrayList<String>selectedServiceArray=new ArrayList<>();
private ArrayList<Integer>selectedCostArayy=new ArrayList<>();
private ArrayList<HashMap<String,String>>stylistArr=new ArrayList<>();
private ArrayList<String>selectedServiceId=new ArrayList<>();
private ArrayList<ArrayList<String>>selectedStylistIdArray=new ArrayList<>();
private ArrayList<ArrayList<String>>selectedDurArray=new ArrayList<>();
private ArrayList<ArrayList<String>>stylidArr=new ArrayList<>();
private ArrayList<ArrayList<String>>durationArr=new ArrayList<>();
private ArrayList<String>services;
public DifferentGenderServicesAdapter(ArrayList<String> serviceId,int position) {
this.serviceId = serviceId;
this.categoryPosition=position;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.services_item, parent, false);
return new DifferentGenderServicesAdapter.listViewHolder(view);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
try {
final FirebaseFirestore firebaseFirestore= FirebaseFirestore.getInstance();
if(categoryPosition==0){
String service=serviceId.get(position);
firebaseFirestore.collection("services_men").document(service).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if(task.isSuccessful()){
ArrayList<String>stylistIdArray=new ArrayList<>();
ArrayList<String>durationArray=new ArrayList<>();
servicename=task.getResult().getString("name");
serviceprice=task.getResult().getLong("price").intValue();
stylistArr=(ArrayList<HashMap<String, String>>)task.getResult().get("services");
for (int i=0;i<stylistArr.size();i++){
String stylist=stylistArr.get(i).get("stylist");
String duration=stylistArr.get(i).get("duration");
stylistIdArray.add(stylist);
durationArray.add(duration);
}
stylidArr.add(stylistIdArray);
durationArr.add(durationArray);
}
serviceArray.add(servicename);
costArray.add(serviceprice);
for(int i=0;i<serviceArray.size();i++){
((listViewHolder)holder).servicenameTv.setText(serviceArray.get(i));
((listViewHolder)holder).serviceCost.setText(Integer.toString(costArray.get(i)));
}
}
});
}
}
((listViewHolder)holder).checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(services==null || services.size()==1 || services.equals("") || services.size()==0){
ArrayList<String>selectedStylistId=new ArrayList<>();
ArrayList<String>selectedDuration=new ArrayList<>();
ArrayList<String>servicesArr=new ArrayList<>(serviceArray);
if(((listViewHolder) holder).checkBox.isChecked()){
String service=servicesArr.get(position);
Integer cost=costArray.get(position);
String serviceid=serviceId.get(position);
selectedStylistId=stylidArr.get(position);
selectedDuration=durationArr.get(position);
selectedStylistIdArray.add(selectedStylistId);
selectedDurArray.add(selectedDuration);
selectedServiceId.add(serviceid);
selectedServiceArray.add(service);
selectedCostArayy.add(cost);
serviceTv.setText(selectedServiceArray.toString().replaceAll("\\[|\\]", ""));
}else {
String service=serviceArray.get(position);
Integer cost=costArray.get(position);
String serviceid=serviceId.get(position);
selectedStylistId=stylidArr.get(position);
selectedDuration=durationArr.get(position);
selectedStylistIdArray.remove(selectedStylistId);
selectedDurArray.remove(selectedDuration);
selectedServiceId.remove(serviceid);
selectedServiceArray.remove(service);
selectedCostArayy.remove(cost);
serviceTv.setText(selectedServiceArray.toString().replaceAll("\\[|\\]", ""));
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public int getItemCount() {
return serviceId.size();
}
private class listViewHolder extends RecyclerView.ViewHolder {
private CheckBox checkBox;
private TextView servicenameTv, serviceCost;
int count = 0;
String strService;
public listViewHolder(final View itemView) {
super(itemView);
try {
servicenameTv = (TextView) itemView.findViewById(R.id.damerServiceTV);
serviceCost = (TextView) itemView.findViewById(R.id.damerRsTV);
checkBox = (CheckBox) itemView.findViewById(R.id.checkBox);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
我的serviceId数组包含firestore集合的documentId。通过使用此ID,我想从其他集合中获取详细信息并必须在recyclerview中填充它。
问题: i)我可以使用该ID来从其他集合中获取详细信息,但有时会获取其第二个Documentid值,因此当我选择该项目下的某个项目时,该项目将被选中,而不是选定的一个
ii)仅在某些情况下会发生此问题。如果运行该应用程序正常运行10次,剩余时间运行6次,则其值输入错误。
iii)我正在将documentid从片段传递到适配器,同时我检查了数组中的值,其值始终相同,并且没有变化。
答案 0 :(得分:0)
RecyclerView
与GridView
的不同之处在于,该名称暗示它回收视图,而不是为每个数据项创建一个视图。
因此解决方案是您在适配器中使用以下方法:
@Override
public int getItemViewType(int position) {
return position;
}