簡體   English   中英

RecyclerView 適配器問題

[英]RecyclerView adapter issue

在回收視圖的適配器視圖中加載數據時遇到問題。

我在活動中有兩個Fragment ,第二個Fragment有 3 個回收視圖。 但問題是我在原始視圖持有者中有一個checkbox ,我檢查了其中的一些。 當我向上/向下滾動時, recycleview數據的數據重新排列為默認值,所有復選框再次為 false。

我在綁定方法中使用了 set recycle(false) 但仍然無法正常工作。

public class VenueOrderPriceAdapter extends
        RecyclerView.Adapter<VenueOrderPriceAdapter.DataViewHolder> {

    static Context mContext;
    public static double final_total;
    public static String selected_hr,selected_min;

    static private List<VenueOrderPriceModel> stList;
    static private String str_id, str_charges, str_is_flat_charges, str_is_per_person_charges;
            /*str_hour_extension_charges, str_extra_person_charges=null, str_is_group_size, str_group_size_from,
            str_group_size_to*/;
    private static boolean isPkgAdded;

    public VenueOrderPriceAdapter(Context mContext, List<VenueOrderPriceModel> students) {
        this.mContext = mContext;
        this.stList = students;
    }

    // Create new views
    @Override
    public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_venueorder_price, parent,false);
        Log.e("on create called---","dsdf--111");
        // create ViewHolder

        DataViewHolder viewHolder = new DataViewHolder(itemLayoutView);

        final_total=0;


        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final DataViewHolder viewHolder, final int positiona) {
        Log.e("on bind called---","dsdf"+positiona);
        viewHolder.setIsRecyclable(false);


    }

    // Return the size arraylist
    @Override
    public int getItemCount() {
        return stList.size();
    }

    public static class DataViewHolder extends RecyclerView.ViewHolder {

        public TextView tvName,tv_details,tv_duration ,tv_guestCount,tv_price,tv_extra_charge,tv_addtocart,tv_pkg_rate;
        CheckBox cb_selectedprice;
        private LinearLayout ll_extra,ll_extra_charge;
        Spinner sp_hh,sp_mm,sp_qty;
        ImageView img_clock,img_guest,img_remove;

        public DataViewHolder(View itemLayoutView) {
            super(itemLayoutView);


            tvName = (TextView) itemLayoutView.findViewById(R.id.tvName);
            tv_details = (TextView) itemLayoutView.findViewById(R.id.tv_details);
            tv_duration = (TextView) itemLayoutView.findViewById(R.id.tv_duration);
            tv_guestCount = (TextView) itemLayoutView.findViewById(R.id.tv_guestCount);
            tv_price =  (TextView) itemLayoutView.findViewById(R.id.tv_price);
            tv_extra_charge =   (TextView)itemLayoutView.findViewById(R.id.tv_extra_charge);
            tv_pkg_rate  =   (TextView)itemLayoutView.findViewById(R.id.tv_pkg_rate);

            img_clock  =   (ImageView) itemLayoutView.findViewById(R.id.img_clock);
            img_guest  =   (ImageView) itemLayoutView.findViewById(R.id.img_guest);
            img_remove  =   (ImageView) itemLayoutView.findViewById(R.id.img_remove);

            sp_hh = (Spinner)itemView.findViewById(R.id.sp_hh);
            sp_mm = (Spinner)itemView.findViewById(R.id.sp_mm);
            sp_qty = (Spinner)itemView.findViewById(R.id.sp_qty);

          //  tv_ext_person= (TextView)itemView.findViewById(R.id.tv_ext_person);

            ll_extra =(LinearLayout)itemView.findViewById(R.id.ll_extra);
            ll_extra_charge  =(LinearLayout)itemView.findViewById(R.id.ll_extra_charge);

            tv_addtocart= (TextView) itemView.findViewById(R.id.tv_addtocart);

            cb_selectedprice =(CheckBox)itemView.findViewById(R.id.cb_selectedprice);


            final int position = getAdapterPosition();

            String extra_duration_charge = "";
            str_id= stList.get(position).getId();

            if(stList.get(position).getIs_applicable().equalsIgnoreCase("0")){
                itemView.setEnabled(false);
                itemView.setClickable(false);
                itemView.setBackgroundResource(R.color.md_blue_grey_50);
                tv_addtocart.setVisibility(View.GONE);
            }


            tvName.setText(stList.get(position).getPackage_name());

            tv_details.setText(stList.get(position).getChrages_inclusion());

            tv_price.setText(" $ "+Const.GLOBAL_FORMATTER.format(Double.parseDouble(stList.get(position).getCharges())));

            if(stList.get(position).getPacakage_hours()!=null){
                tv_duration.setText(stList.get(position).getPacakage_hours().substring(0,stList.get(position).getPacakage_hours().length()-3)+" hr");
            }else{
                tv_duration.setVisibility(View.GONE);
            }

            if(stList.get(position).getIs_group_charges().equalsIgnoreCase("1")){
                tv_guestCount.setText(stList.get(position).getGroup_size_from()
                        +"-"
                        +stList.get(position).getGroup_size_to() +" Guest");
            }else{
                tv_guestCount.setVisibility(View.GONE);
            }



    //======EXTRA GUEST AND TIME CONDITION FOR TEXT VIEW ==========================================
                if(stList.get(position).getIs_hour_extension_charges()!=null) {
                    if(stList.get(position).getIs_hour_extension_charges().equalsIgnoreCase("1")){
                        ll_extra_charge.setVisibility(View.VISIBLE);
                        if (stList.get(position).getExtension_hours().substring(0, 2).equalsIgnoreCase("00")) {
                            extra_duration_charge = "$ " + stList.get(position).getHour_extension_charges() + " / " + stList.get(position).getExtension_hours().substring(3, 5) + " min";
                        } else {
                            extra_duration_charge = "$ " + stList.get(position).getHour_extension_charges() + " / " + stList.get(position).getExtension_hours().substring(0, 5) + " hours";
                        }

                        tv_extra_charge.setText(extra_duration_charge);
                    }
                }


                if(stList.get(position).getIs_group_charges().equalsIgnoreCase("1") &&  stList.get(position).getIs_extra_person_charges().equalsIgnoreCase("1")){

                    extra_duration_charge = extra_duration_charge+"\n"+"$"+stList.get(position).getIs_extra_person_charges()+"/ person";
                    tv_extra_charge.setText(extra_duration_charge);
                }
                if(extra_duration_charge==null || extra_duration_charge.length()<1){
                    ll_extra_charge.setVisibility(View.GONE);
                    if(stList.get(position).getIs_flat_charges().equalsIgnoreCase("1")){
                        tv_pkg_rate.setText("Flat Rate");
                    } else if(stList.get(position).getIs_perperson_charges().equalsIgnoreCase("1")){
                        tv_pkg_rate.setText("Per Person");
                    } else if(stList.get(position).getIs_perhour_charges().equalsIgnoreCase("1")) {
                        tv_pkg_rate.setText("Per Hour");
                    }
                }else{
                    if(stList.get(position).getIs_flat_charges().equalsIgnoreCase("1")){
                        tv_pkg_rate.setText("Flat Rate");
                    } else if(stList.get(position).getIs_perperson_charges().equalsIgnoreCase("1")){
                        tv_pkg_rate.setText("Per Person");
                    } else if(stList.get(position).getIs_perhour_charges().equalsIgnoreCase("1")) {
                        tv_pkg_rate.setText("Per Hour");
                    }
                }


    //==========FLAT PER PERSON PER HOURE CHARGES CONDITION======================================================
                if(stList.get(position).getIs_flat_charges().equalsIgnoreCase("1")){
                    ll_extra.setVisibility(View.INVISIBLE);
                    // tv_ext_person.setVisibility(View.GONE);


                } else if(stList.get(position).getIs_perperson_charges().equalsIgnoreCase("1")){

                    if(stList.get(position).getIs_group_charges().equalsIgnoreCase("1") &&  stList.get(position).getExtra_person_charges()!=null){
                        ll_extra.setVisibility(View.VISIBLE);
                        img_clock.setVisibility(View.GONE);
                        sp_hh.setVisibility(View.GONE);
                        //np_itemcount.setVisibility(View.VISIBLE);
                        // tv_ext_person.setVisibility(View.VISIBLE);
                        //np_itemcount.setMaxValue(Integer.parseInt(stList.get(position).getGroup_size_to()));
                    }else{
                        ll_extra.setVisibility(View.INVISIBLE);
                        //tv_ext_person.setVisibility(View.GONE);

                    }

                    if(stList.get(position).getIs_extra_person_charges().equalsIgnoreCase("0")){
                        ll_extra.setVisibility(View.INVISIBLE);
                        //tv_ext_person.setVisibility(View.GONE);
                    }

                }else if(stList.get(position).getIs_perhour_charges().equalsIgnoreCase("1")) {
                    ll_extra.setVisibility(View.VISIBLE);
                    img_guest.setVisibility(View.GONE);
                    sp_qty.setVisibility(View.GONE);
                    //ll_duration.setVisibility(View.GONE);
                }


                List<String> list_hh = new ArrayList<String>();
                list_hh.add("HH");
                list_hh.add("01");
                list_hh.add("02");
                list_hh.add("03");
                list_hh.add("04");
                list_hh.add("05");
                list_hh.add("06");
                list_hh.add("07");
                list_hh.add("08");
                list_hh.add("09");
                list_hh.add("10");
                list_hh.add("11");
                list_hh.add("12");

                ArrayAdapter<String> dataAdapter_hh = new ArrayAdapter<String>(mContext,android.R.layout.simple_spinner_item, list_hh);
                dataAdapter_hh.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                sp_hh.setAdapter(dataAdapter_hh);


                List<String> list_mm = new ArrayList<String>();
                list_mm.add("MM");
                list_mm.add("00");
                list_mm.add("15");
                list_mm.add("30");
                list_mm.add("45");

                ArrayAdapter<String> dataAdapter_mm = new ArrayAdapter<String>(mContext,android.R.layout.simple_spinner_item, list_mm);
                dataAdapter_mm.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                sp_mm.setAdapter(dataAdapter_mm);

                List<String> list_qty = new ArrayList<String>();
                list_qty.add("Guest");
                for(int a=0;a<100;a++){
                    list_qty.add(Integer.toString(a));
                }
                ArrayAdapter<String> dataAdapter_qty = new ArrayAdapter<String>(mContext,android.R.layout.simple_spinner_item, list_qty);
                dataAdapter_qty.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                sp_qty.setAdapter(dataAdapter_qty);


                sp_hh.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int positionSP, long id) {

                        if(sp_mm.getSelectedItemPosition()>1 && positionSP>1){
                            final_total = Double.parseDouble(stList.get(position).getCharges())+(Double.parseDouble(stList.get(position).getCharges()) * (double) (sp_hh.getSelectedItemPosition()  +1) );
                        }else{
                            if(positionSP > 1) {
                                final_total = Double.parseDouble(stList.get(position).getCharges())+(Double.parseDouble(stList.get(position).getCharges()) * (double) (sp_hh.getSelectedItemPosition()));
                            }else{
                                final_total = Double.parseDouble(stList.get(position).getCharges());
                            }
                        }
                    /* Toast.makeText(parent.getContext(), "Time : " +
                                         sp_hh.getItemAtPosition(sp_hh.getSelectedItemPosition()).toString()
                                        + ":"
                                        +String.valueOf(sp_mm.getSelectedItem()), Toast.LENGTH_SHORT).show();*/
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {

                    }
                });



                sp_mm.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int positionSP, long id) {
                        if(positionSP>1){
                            final_total = Double.parseDouble(stList.get(position).getCharges())+(Double.parseDouble(stList.get(position).getCharges()) *(double) (sp_hh.getSelectedItemPosition() + 1 ));
                            // tv_menutitle_venuepricing.setText("Pricing Plans "+" ( Total : "+final_total+" )");
                        }else{
                            if(sp_hh.getSelectedItemPosition()>0){
                                final_total =Double.parseDouble(stList.get(position).getCharges())+(Double.parseDouble(stList.get(position).getCharges()) * (double) (sp_hh.getSelectedItemPosition()));
                            }else{
                                final_total = Double.parseDouble(stList.get(position).getCharges());
                            }
                        }
                                /*Toast.makeText(parent.getContext(), "Time : " + sp_hh.getItemAtPosition(sp_hh.getSelectedItemPosition()).toString()
                                        + ":" +sp_mm.getItemAtPosition(sp_mm.getSelectedItemPosition()).toString(), Toast.LENGTH_SHORT).show();*/

                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {

                    }
                });



            /*chkSelected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


                    if(chkSelected.isChecked()==true){
                        checked_count=checked_count+1;
                            if(checked_count > 1){
                                chkSelected.setChecked(false);
                                checked_count=checked_count-1;
                                Log.d("chk count ",""+checked_count);
                            }else {
                               Log.d("chk count",""+checked_count);
                                    if(stList.get(position).getIs_perperson_charges().equalsIgnoreCase("1")){
                                        final_total = Double.parseDouble(stList.get(position).getCharges()) * Double.parseDouble(et_guestCount.getText().toString());
                                      //  tv_menutitle_venuepricing.setText("Pricing Plans "+" ( Total : "+final_total+" )");

                                    }else if(stList.get(position).getIs_perhour_charges().equalsIgnoreCase("1")){
                                            if(np_minutes_venue_pkg.getValue()>0){
                                                final_total = Double.parseDouble(stList.get(position).getCharges()) * (double)(np_hour_venue_pkg.getValue()+1);
                                             //   tv_menutitle_venuepricing.setText("Pricing Plans "+" ( Total : "+final_total+" )");
                                            }else{
                                                if(np_hour_venue_pkg.getValue()>0) {
                                                    final_total = Double.parseDouble(stList.get(position).getCharges()) * (double) (np_hour_venue_pkg.getValue());
                                                  //  tv_menutitle_venuepricing.setText("Pricing Plans " + " ( Total : "+ Const.GLOBAL_FORMATTER.format(final_total) + " )");
                                                }else{
                                                    final_total = Double.parseDouble(stList.get(position).getCharges());
                                                    //tv_menutitle_venuepricing.setText("Pricing Plans " + " ( Total : "+ Const.GLOBAL_FORMATTER.format(final_total) + " )");
                                                }
                                            }

                                            selected_hr= Integer.toString(np_hour_venue_pkg.getValue());
                                            if(selected_hr.length()<=1){
                                                selected_hr="0"+selected_hr;
                                            }

                                            selected_min=Integer.toString(np_minutes_venue_pkg.getValue());
                                            if(selected_min.length()<=1){
                                                selected_min="0"+selected_min;
                                            }

                                    }else if(stList.get(position).getIs_flat_charges().equalsIgnoreCase("1")){

                                        if(stList.get(position).getIs_group_charges().equalsIgnoreCase("1") && stList.get(position).getIs_extra_person_charges().equalsIgnoreCase("1") ){
                                            int guest_from =Integer.parseInt(stList.get(position).getGroup_size_from());
                                            int guest_to =Integer.parseInt(stList.get(position).getGroup_size_to());
                                            int guest =Integer.parseInt(et_guestCount.getText().toString());

                                            if(guest>guest_to){
                                                int extra_guest = guest-guest_to;
                                                final_total = ((double)extra_guest * Double.parseDouble(stList.get(position).getExtra_person_charges()) )
                                                        +Double.parseDouble(stList.get(position).getCharges());
                                               // tv_menutitle_venuepricing.setText("Pricing Plans " + " ( Total : " + Const.GLOBAL_FORMATTER.format(final_total) + " )");
                                            }else{
                                                final_total = Double.parseDouble(stList.get(position).getCharges());
                                               // tv_menutitle_venuepricing.setText("Pricing Plans " + " ( Total : "+ Const.GLOBAL_FORMATTER.format(final_total) + " )");
                                            }

                                        }else {
                                            final_total = Double.parseDouble(stList.get(position).getCharges());
                                           // tv_menutitle_venuepricing.setText("Pricing Plans " + " ( Total : "+ Const.GLOBAL_FORMATTER.format(final_total) + " )");
                                        }
                                    }
                            }
                    }else{
                        checked_count=checked_count-1;
                        Log.d("chk count",""+checked_count);
                        if(checked_count==0){
                       // tv_menutitle_venuepricing.setText("Pricing Plans ");
                        }
                    }

                    VenueOrderPriceModel contact = (VenueOrderPriceModel) chkSelected.getTag();

                    contact.setSelected(chkSelected.isChecked());
                    stList.get(getAdapterPosition()).setSelected(chkSelected.isChecked());
                    *//*Toast.makeText(
                                chkSelected.getContext(),
                                "Clicked on Checkbox: " + chkSelected.getText() + " is "
                                        + chkSelected.isChecked(), Toast.LENGTH_LONG).show();*//*
                }
            });*/




                if (cb_selectedprice.isChecked()==true){
                    img_remove.setVisibility(View.VISIBLE);
                }else{
                    img_remove.setVisibility(View.GONE);
                }

                img_remove.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        isPkgAdded=false;
                        cb_selectedprice.setChecked(false);
                        img_remove.setVisibility(View.GONE);
                        tv_addtocart.setBackground(mContext.getResources().getDrawable(R.drawable.rounded_corner_orange_white_borde,mContext.getTheme()));
                        tv_addtocart.setEnabled(true);
                        final_total=0;
                    }
                });

                tv_addtocart.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (isPkgAdded == true || cb_selectedprice.isChecked()==true) {
                            Toast.makeText(mContext, "First Remove Added Pacakge", Toast.LENGTH_LONG).show();
                        } else {
                            Log.e("boooking details --",str_dateselected+str_guest_count+str_timeslot);
                            }
                    }
                });

            }

        }

        // method to access in activity after updating selection
        public List<VenueOrderPriceModel> getStudentist() {
            return stList;
        }

    }

您必須從每個位置的復選框的 onCheckChangeListener 維護數據模型中每個復選框的狀態。

然后你必須在適配器的 onBind 方法中設置復選框狀態

回收器視圖回收 OnBindViewHolder 中的視圖。 所以當項目滾動視圖再次回收。解決這個問題。

創建一個全局變量來存儲點擊的位置。

private mItemSelected=-1;

然后在 viewholder 中添加 clickListener 和 onClick 存儲被點擊項目的位置。

public class ViewHolder extends RecyclerView.ViewHolder {

    public ViewHolder(View v) {
        super(v);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mItemSelected = getAdapterPosition();
                notifyDataSetChanged();

            }
        });
    }
}

在 OnBindViewHolder 里面,

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {

    if(mItemSelected==position){
        holder.status.setChecked(true)‌;
    }else{
        holder.status.setChecked(false)‌;
    }
}

暫無
暫無

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

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