首页 > 解决方案 > 如何使用rest api调用单击上一个按钮后保持复选框状态

问题描述

模型类

public class TestListModel {

private String testlist_id;
private String test_price;
private String test_name;

private boolean isSelected;

public TestListModel(String testlist_id, String test_price, String test_name,boolean isSelected) {
    this.testlist_id = testlist_id;
    this.test_price = test_price;
    this.test_name = test_name;
    this.isSelected = isSelected;
}

public String getTestlist_id() {
    return testlist_id;
}

public void setTestlist_id(String testlist_id) {
    this.testlist_id = testlist_id;
}

public String getTest_price() {
    return test_price;
}

public void setTest_price(String test_price) {
    this.test_price = test_price;
}

public String getTest_name() {
    return test_name;
}

public void setTest_name(String test_name) {
    this.test_name = test_name;
}

public boolean isSelected() {
    return isSelected;
}

public boolean setSelected(boolean isSelected) {
    this.isSelected = isSelected;
    return isSelected;
}
}

回收器适配器类

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

private ArrayList<TestListModel> android;


public RecyclerAdapter(ArrayList<TestListModel> android) {
    this.android = android;
}



@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.test_list_row,parent,false);

    return new ViewHolder(view);
}



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

    holder.test_name.setText(android.get(position).getTest_name());
    holder.test_price.setText(android.get(position).getTest_price());

    holder.chkSelected.setChecked(android.get(position).isSelected());

    holder.chkSelected.setTag(android.get(position));

    holder.chkSelected.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            CheckBox cb = (CheckBox) v;
            TestListModel contact = (TestListModel) cb.getTag();

            contact.setSelected(cb.isChecked());
            android.get(position).setSelected(cb.isChecked());

            Toast.makeText(
                    v.getContext(),
                    "Clicked on Checkbox: " + cb.getText() + " is "
                            + cb.isChecked(), Toast.LENGTH_LONG).show();

        }
    });
}


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

public class ViewHolder extends RecyclerView.ViewHolder {
    private TextView test_name;
    private TextView test_price;
    public CheckBox chkSelected;

    public TestListModel testLists;

    public ViewHolder(View itemView) {
        super(itemView);

        test_name = (TextView)itemView.findViewById(R.id.test_name);
        test_price = (TextView)itemView.findViewById(R.id.price_name);
        chkSelected = (CheckBox) itemView.findViewById(R.id.check_box);

    }
}

// method to access in activity after updating selection
public List<TestListModel> getTestList() {
    return android;
}

}

健康活动

 public class HealthServicesActivity extends AppCompatActivity implements View.OnClickListener {

    SharePreferenceManager<LoginModel> sharePreferenceManager;

  /*
    *Api call
    * */
    private RecyclerView recyclerView;
    private ArrayList<TestListModel> data;
    private RecyclerAdapter madapter;


    private Button submitButton;


  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_health_services);
        ButterKnife.bind(this);

            sharePreferenceManager = new SharePreferenceManager<>(getApplicationContext());
            submitButton = (Button) findViewById(R.id.submit_button);


}


 /*
    * On Click Listner
    * */
    @Override
    public void onClick(View v) {

        switch (v.getId()) {

  case R.id.submit_button:

                        String serialNo="";
                        int serialNum=1;
                        String testListId = "";
                        int totalPrice = 0;
                        String testName = "";
                        String testPrice="";

                        List<TestListModel> stList = ((RecyclerAdapter) madapter)
                                .getTestList();

                        for (int i = 0; i < stList.size(); i++) {
                            TestListModel singleStudent = stList.get(i);


                            if (singleStudent.isSelected() == true) {

                                testListId = testListId+ "," + singleStudent.getTestlist_id().toString();
                                testName = testName + "\n" + "\n" + singleStudent.getTest_name().toString();
                                testPrice= testPrice+"\n" + "\n" + singleStudent.getTest_price().toString();
                                serialNo=serialNo + "\n" + "\n"+ Integer.parseInt(String.valueOf(serialNum));

                                serialNum++;

                                totalPrice= totalPrice+ Integer.parseInt(stList.get(i).getTest_price());

                                Intent in= new Intent(HealthServicesActivity.this, AmountCartActivity.class);

                                in.putExtra("test_id",testListId);
                                in.putExtra("test_name", testName);
                                in.putExtra("test_price", testPrice);
                                in.putExtra("total_price",totalPrice);
                                in.putExtra("serial_number",serialNo);

                                in.putExtra("patient_id",patientID);

                                startActivity(in);


                            }
                            else
                                Toasty.error(getApplicationContext(), "Please Select Test Lists", Toast.LENGTH_SHORT, true).show();
                        }


                        break;

                       /* Toast.makeText(HealthServicesActivity.this,
                                "Selected Lists: \n" + testName+""+testPrice, Toast.LENGTH_LONG)
                                .show();*/


                    /** back Button Click
                    * */
                    case R.id.back_to_add_patient:
                    startActivity(new Intent(getApplicationContext(), PatientActivity.class));
                    finish();
                    break;


            default:
                break;
        }
    } 


 /*
    * Api Call For Displaying Test Lists
    * */
    private void loadJSON() {

        String centerID=(sharePreferenceManager.getUserLoginData(LoginModel.class).getResult().getCenterId());

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(" http://192.168.1.80/aoplnew/api/")
//                .baseUrl("https://earthquake.usgs.gov/fdsnws/event/1/query?")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        ApiInterface request = retrofit.create(ApiInterface.class);
        Call<JSONResponse> call = request.getTestLists("http://192.168.1.80/aoplnew/api/users/gettestlist/"+centerID);
        call.enqueue(new Callback<JSONResponse>() {


            @Override
            public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {

                JSONResponse jsonResponse = response.body();
                data = new ArrayList<>(Arrays.asList(jsonResponse.getResult()));
                madapter = new RecyclerAdapter(data);
                recyclerView.setAdapter(madapter);

                Toast.makeText(HealthServicesActivity.this, "APi Call Back", Toast.LENGTH_SHORT).show();

            }


            @Override
            public void onFailure(Call<JSONResponse> call, Throwable t) {
                Log.d("Error",t.getMessage());
            }
        });
    }


    @Override
    public void onBackPressed() {
        super.onBackPressed();
        startActivity(new Intent(getApplicationContext(), PatientActivity.class));
        finish();

    }
}

金额购物车活动

public class AmountCartActivity extends AppCompatActivity implements View.OnClickListener , PaymentResultListener {

 SharePreferenceManager<LoginModel> sharePreferenceManager;

    /*
    *Setting Recycler View
    * */


    private RecyclerView recyclerView;
    List<AmountCartModel> mydataList ;
    private MyAdapter madapter;



    /*
    * Getting Bundle Values
    * */
    Bundle extras ;

    String testId="";
    String testName="";
    String testPrice="";
    String totalPrice="";
    String serialNumber="";


    private Button backButton;


    /*
    * Api Call For DashBoard
    * */
    String st;
    Api webService = ServiceGenerator.getApi();
    ProgressDialog progressDialog;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_amount_cart);
        ButterKnife.bind(this);


    progressDialog = new ProgressDialog(AmountCartActivity.this);
        progressDialog.setMessage("Please Wait...");
        progressDialog.setCanceledOnTouchOutside(false);


        backButton=(Button) findViewById(R.id.back_button);

     showcenterid(sharePreferenceManager.getUserLoginData(LoginModel.class));


        backButton.setOnClickListener(this);

        gettingValues();
    }


 @Override
    public void onClick(View v) {


        switch (v.getId()) {
      /*
                * back Button Click
                * */
            case R.id.back_button:


                startActivity(new Intent(getApplicationContext(), HealthServicesActivity.class));
                //finish();
                break;



            default:
                break;

        }


    }

  /*
    * Getting Bundle Values and Setting Recycler View
    * */
    private void gettingValues() {

        mydataList = new ArrayList<>();
        /*
        * Getting Values From BUNDLE
        * */
        bundle = getIntent().getExtras();

        if (bundle != null) {

            testId=bundle.getString("test_id");

            testName = bundle.getString("test_name");
            testPrice = bundle.getString("test_price");
            totalPrice= String.valueOf(bundle.getInt("total_price"));
            serialNumber=bundle.getString("serial_number");



            //Just add your data in list
            AmountCartModel mydata = new AmountCartModel();  // object of Model Class
            mydata.setTestId(testId);
            mydata.setTestName(testName );
            mydata.setTestPrice(testPrice);
            mydata.setSerialNumber(serialNumber);

            mydataList.add(mydata);


            totalPriceDisplay.setText("Total Amount : "+totalPrice);




        }

        madapter=new MyAdapter(mydataList);
        madapter.setMyDataList(mydataList);
        recyclerView = (RecyclerView)findViewById(R.id.recyler_amount_cart);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(madapter);


    }

用于 AmountCart 的回收器适配器

/*
   * Recycler Adapter
     */
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

        private List<AmountCartModel> context;
        private List<AmountCartModel> myDataList;

        public MyAdapter(List<AmountCartModel> context) {
            this.context = context;
            myDataList = new ArrayList<>();
        }



       @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            // Replace with your layout
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.amount_cart_row, parent, false);
            return new ViewHolder(view);
        }


        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            // Set Your Data here to yout Layout Components..

            // to get Amount
           /* myDataList.get(position).getTestName();
            myDataList.get(position).getTestPrice();*/


            holder.testName.setText(myDataList.get(position).getTestName());
            holder.testPrice.setText(myDataList.get(position).getTestPrice());
            holder.textView2.setText(myDataList.get(position).getSerialNumber());
        }


        @Override
        public int getItemCount() {
            /*if (myDataList.size() != 0) {
                // return Size of List if not empty!
                return myDataList.size();
            }
            return 0;*/
            return myDataList.size();
        }


        public void setMyDataList(List<AmountCartModel> myDataList) {
            // getting list from Fragment.
            this.myDataList = myDataList;
            notifyDataSetChanged();
        }


        public class ViewHolder extends RecyclerView.ViewHolder {

            TextView testName,testPrice,textView2;


            public ViewHolder(View itemView) {
                super(itemView);
                // itemView.findViewById

                testName=itemView.findViewById(R.id.test_name_one);
                testPrice=itemView.findViewById(R.id.test_price);
                textView2=itemView.findViewById(R.id.textView2);
            }
        }

}

如何在活动中维护复选框状态。我在 rest api 调用中使用回收器视图显示复选框。我从 HealthActivity 中选择复选框并单击提交按钮,然后整个列表显示在 AmountCartActivity 中,但是当我单击后退按钮时,我没有得到那些选中的复选框。当我添加或删除任何复选框时,它应该只根据选择给出结果。如何维护选中复选框的状态?

标签: androidrestapicheckbox

解决方案


在您的 AmountCartActivity 中,当您收听后退按钮点击时,您可以执行以下操作:

@Override
public void onClick(View v) {


    switch (v.getId()) {
  /*
            * back Button Click
            * */
        case R.id.back_button:


            startActivity(new Intent(getApplicationContext(), HealthServicesActivity.class));
            //finish();
            break;



        default:
            break;

    }


}

您正在打开一个全新的 HealthServicesActivity 并且您不会将数据保存在任何地方。(当您打开一个新的 HealthServicesActivity 时,它对您的旧列表一无所知)。所以我认为你的目标是完成 AmountCartActivity 并恢复以前的 HealthServicesActivity ,如下所示:

@Override
public void onClick(View v) {


    switch (v.getId()) {
  /*
            * back Button Click
            * */
        case R.id.back_button:


            finish(); //JUST FINISH THE ACTIVITY AND RETURN TO THE PREVIOUS ACTIVITY
            break;



        default:
            break;

    }


}

编辑:(添加项目点击监听器逻辑)

由于您每次提交并返回时都将使用相同的 HealthServiceActivity,我认为您应该实现一个接口来保持您的复选框状态更新。在您各自的方法中进行以下更改(请参阅我的评论)

回收器适配器:

    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

private ArrayList<TestListModel> android;
private OnItemClickListener onItemClickListener; //ADD THIS GLOBAL FIELD

/** THIS METHOD IS TO BIND YOUR NEW ITEM CLICK LISTENER **/
public void setOnItemClickListener(OnItemClickListener onItemClickListener) 
{
    this.onItemClickListener = onItemClickListener;
}

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

    holder.test_name.setText(android.get(position).getTest_name());
    holder.test_price.setText(android.get(position).getTest_price());

    holder.chkSelected.setChecked(android.get(position).isSelected());

    //YOU DON'T HAVE TO DEAL WITH TAGS, JUST USE BELOW CODE TO SET YOUR
    // ITEM CLICK LISTENER TO EACH CHECKBOX
    holder.chkSelected.setOnClickListener(v ->
                onItemClickListener.onClickItem(position);
}

// THIS METHOD WILL SWITCH YOUR SELECT STATES AND UPDATE ITEMS ACCORDINGLY
public void updateCheckboxState(int position){
   TestListModel listItem = android.get(position);
   listItem.setSelected(!listItem.isSelected());
   notifyDataSetChanged();
}

// ADD THIS INTERFACE
public interface OnItemClickListener {
    void onClickItem(int position);
}

}

健康服务活动:

    //DON'T FORGET TO IMPLEMENT RecylcerAdapter.OnItemClickListener
    public class HealthServicesActivity extends AppCompatActivity implements View.OnClickListener, RecyclerAdapter.OnItemClickListener {

 /*
    * Api Call For Displaying Test Lists
    * */
    private void loadJSON() {

    { ... }

            @Override
            public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {

                JSONResponse jsonResponse = response.body();
                data = new ArrayList<>(Arrays.asList(jsonResponse.getResult()));
                madapter = new RecyclerAdapter(data);
                madapter.setOnItemClickListener(this); // SET YOUR LISTENER HERE
                recyclerView.setAdapter(madapter);

                Toast.makeText(HealthServicesActivity.this, "APi Call Back", Toast.LENGTH_SHORT).show();

            }

// UPDATE CHECKBOX STATES WHEN AN ITEM IS CLICKED
@Override
public void onClickItem(int position) {
    madapter.updateCheckboxState(position);
}
}

推荐阅读