Android在recyclerview中填充选定的复选框值

时间:2018-06-26 04:25:53

标签: java android

    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从片段传递到适配器,同时我检查了数组中的值,其值始终相同,并且没有变化。

1 个答案:

答案 0 :(得分:0)

RecyclerViewGridView的不同之处在于,该名称暗示它回收视图,而不是为每个数据项创建一个视图。

因此解决方案是您在适配器中使用以下方法:

@Override
public int getItemViewType(int position) {
    return position;
}