首页 > 解决方案 > 在 RecyclerView 中使用 JSON 数据和 ToggleButton 进行计算

问题描述

我想使用带有 ToggleButton 的 RecyclerView 中的 JSON 数据进行计算。当切换按钮被选中时,值应该改变,当它没有被选中时,该特定 RecyclerView 行的值应该再次改变。问题是当我单击 ToggleButton 时,还检查了另外 2 个 RecyclerView 行的 ToggleButton。

代码:

活动


import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.gridlayout.widget.GridLayout;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class GstPlanner extends AppCompatActivity implements GstPlanAdapter.GstPlanListener{
    private static final String TAG = GstPlanner.class.getSimpleName();
    List<String> dateNames = new ArrayList<String>();
    private List<GstPlanList> GSTLisT;
    private GstPlanAdapter mAdapter;
    Context context;
    Spinner ret_pending_drop, state_drop, nil_drop;
    String URL, URL1;
    ProgressBar progress_gst, Progress_Gst_Plan;
    GridLayout grid_gst;
    TextView txt_retry_gst, txt_state_gst, txt_ret_type, txt_final_gst;
    Button btn_retry_gst, btn_submit_state, btn_submit;
    String State_GET;
    RecyclerView recyclerView1;
    RelativeLayout Gst_Plan_Relative;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gst_planner);

        Gst_Plan_Relative = findViewById(R.id.Gst_Plan_Relative);
        recyclerView1 = findViewById(R.id.Recycler_Gst_Plan);
        Progress_Gst_Plan = findViewById(R.id.Progress_Gst_Plan);
        btn_submit_state = findViewById(R.id.btn_submit_state);
        txt_state_gst = findViewById(R.id.txt_state_gst);
        txt_ret_type = findViewById(R.id.txt_ret_type);
        txt_retry_gst = findViewById(R.id.txt_retry_gst);
        btn_retry_gst = findViewById(R.id.btn_retry_gst);
        ret_pending_drop = findViewById(R.id.ret_pending_drop);
        txt_final_gst = findViewById(R.id.txt_final_gst);
        state_drop = findViewById(R.id.state_drop);
        btn_submit = findViewById(R.id.btn_submit);
        nil_drop = findViewById(R.id.nil_drop);
        grid_gst = findViewById(R.id.grid_gst);
        progress_gst = findViewById(R.id.progress_gst);

        GSTLisT = new ArrayList<>();
        mAdapter = new GstPlanAdapter(this, GSTLisT, this);

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView1.setLayoutManager(mLayoutManager);
        recyclerView1.setItemAnimator(new DefaultItemAnimator());
        recyclerView1.addItemDecoration(new MyDividerItemDecoration(this, DividerItemDecoration.VERTICAL, 36));
        recyclerView1.setAdapter(mAdapter);

        btn_submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                URL1 = "http://url.com/something.php?state="+state_drop.getSelectedItem().toString()+"&RType="+txt_ret_type.getText().toString()+"&NIL="+nil_drop.getSelectedItem().toString()+"&Month="+ret_pending_drop.getSelectedItem().toString();
                Log.e("URL1",URL1);
                Progress_Gst_Plan.setVisibility(View.VISIBLE);
                fetchData();
                GlobalValue.getit = true;
            }
        });

        btn_submit_state.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                URL = "http://url.com/something.php?state="+state_drop.getSelectedItem().toString();
                State_GET = state_drop.getSelectedItem().toString();
                btn_submit_state.setVisibility(View.INVISIBLE);
                state_drop.setVisibility(View.INVISIBLE);
                progress_gst.setVisibility(View.VISIBLE);
                fetchMonths();

            }
        });


        btn_retry_gst.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                progress_gst.setVisibility(View.INVISIBLE);
                txt_retry_gst.setVisibility(View.GONE);
                btn_retry_gst.setVisibility(View.GONE);
                btn_submit_state.setVisibility(View.VISIBLE);
                state_drop.setVisibility(View.VISIBLE);
            }
        });

    }

    private void fetchData() {




            JsonArrayRequest request = new JsonArrayRequest(URL1,
                    new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {
                            if (response == null) {
                                Toast.makeText(getApplicationContext(), "Couldn't fetch the Details! Please try again.", Toast.LENGTH_LONG).show();
                                return;
                            }

                            Gst_Plan_Relative.setVisibility(View.VISIBLE);
                            Progress_Gst_Plan.setVisibility(View.INVISIBLE);


                            List<GstPlanList> items = new Gson().fromJson(response.toString(), new TypeToken<List<GstPlanList>>() {
                            }.getType());

                            // adding contacts to contacts list
                            GSTLisT.clear();
                            GSTLisT.addAll(items);


                            // refreshing recycler view
                            mAdapter.notifyDataSetChanged();
                            Progress_Gst_Plan.setVisibility(View.GONE);
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error in getting json
                    Log.e(TAG, "Error: " + error.getMessage() +error.getCause());
                    AlertDialog("Error...Please try after some time.");
                    progress_gst.setVisibility(View.INVISIBLE);
                    txt_retry_gst.setVisibility(View.VISIBLE);
                    btn_retry_gst.setVisibility(View.VISIBLE);
                    btn_submit.setVisibility(View.INVISIBLE);
                    Gst_Plan_Relative.setVisibility(View.INVISIBLE);
                }
            });

            APP.getInstance().addToRequestQueue(request);
        }






    private void fetchMonths() {


        StringRequest stringRequest = new StringRequest(URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {

                    JSONArray jsonArray = new JSONArray(response);
                    JSONObject object = jsonArray.getJSONObject(0);
                    JSONArray arrayContacts = object.getJSONArray("Status");

                    for (int i = 0; i<arrayContacts.length(); i++) {
                        JSONObject contactObject = arrayContacts.getJSONObject(i);
                        dateNames.add(contactObject.getString("Month"));
                    }


                        spinnervalue(dateNames, ret_pending_drop);

                    txt_state_gst.setText(State_GET);
                    progress_gst.setVisibility(View.INVISIBLE);
                    grid_gst.setVisibility(View.VISIBLE);
                    txt_retry_gst.setVisibility(View.GONE);
                    btn_retry_gst.setVisibility(View.GONE);
                    btn_submit.setVisibility(View.VISIBLE);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                AlertDialog("Error...Please try after some time.");
                progress_gst.setVisibility(View.INVISIBLE);
                txt_retry_gst.setVisibility(View.VISIBLE);
                btn_retry_gst.setVisibility(View.VISIBLE);
                btn_submit.setVisibility(View.INVISIBLE);


            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(stringRequest);
    }


    public void spinnervalue(List<String> value, Spinner spinner1){

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>
                (this, android.R.layout.simple_spinner_item, value);

        dataAdapter.setDropDownViewResource
                (android.R.layout.simple_spinner_dropdown_item);

        spinner1.setAdapter(dataAdapter);
    }


    public void AlertDialog(String s) {
        try{
            AlertDialog.Builder builder1 = new AlertDialog.Builder(GstPlanner.this);
            builder1.setMessage(s);
            builder1.setCancelable(true);


            builder1.setPositiveButton(
                    "Ok",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });


            AlertDialog alert11 = builder1.create();
            alert11.show();
        }catch (
                WindowManager.BadTokenException ex){
            ex.printStackTrace();
        }
    }


    @Override
    public void onSubTotalUpdate(int total){
        txt_final_gst.setText(String.valueOf(total));
    }

RecyclerView 适配器


import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.Spinner;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.ToggleButton;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.recyclerview.widget.RecyclerView;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;



public class GstPlanAdapter extends RecyclerView.Adapter<GstPlanAdapter.MyViewHolder>
        implements Filterable {
    private Context context;
    private List<GstPlanList> GstPlanList;
    private List<GstPlanList> GstPlanListFiltered;
    private GstPlanListener listener;
    int totalPrice;

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView ret_month, due_date, penalty_amt;
        Spinner nil_ret;
        ToggleButton toggleSwitch;



        public MyViewHolder(View view) {
            super(view);


            ret_month = view.findViewById(R.id.ret_month);
            due_date = view.findViewById(R.id.due_date);
            penalty_amt = view.findViewById(R.id.penalty_amt);
            toggleSwitch = view.findViewById(R.id.switch_gst);

        }
    }


    public GstPlanAdapter(Context context, List<GstPlanList> BiLLList, GstPlanListener listener ) {
        this.context = context;
        this.listener = listener;
        this.GstPlanList = BiLLList;
        this.GstPlanListFiltered = BiLLList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent1, int viewType1) {
        View itemView = LayoutInflater.from(parent1.getContext())
                .inflate(R.layout.gst_plan_view_item_row, parent1, false);

        return new MyViewHolder(itemView);

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {


        final GstPlanList bill = GstPlanListFiltered.get(position);

        holder.nil_ret.setAdapter(categoriesAdapter);

        holder.ret_month.setText(bill.getMonth());
        holder.due_date.setText(bill.getDate());

        holder.penalty_amt.setText(bill.getPenatly().toString());

        totalPrice = 0;
        for (int i = 0; i < GstPlanList.size(); i++) {
            totalPrice += GstPlanList.get(i).getPenatly();
            countTotal(totalPrice);
        }

        if (GlobalValue.getit == true) {
            if (bill.getNIL().equals("YES")) {
                holder.toggleSwitch.setChecked(true);
                GlobalValue.getit = false;
            } else {
                holder.toggleSwitch.setChecked(false);
                GlobalValue.getit = false;
            }
        }



        holder.toggleSwitch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                if (holder.toggleSwitch.isChecked()) {

                    int AC = bill.getTODATE();
                    int BC = Integer.parseInt(bill.getNILNO().toString());
                    int ABC = AC * BC;

                    totalPrice = totalPrice - ABC;

                    int A = bill.getTODATE();
                    int B = Integer.parseInt(bill.getNILYES().toString());
                    int AB = A * B;

                    if (AB >= 10000) {
                        holder.penalty_amt.setText("10000");
                        totalPrice = totalPrice + 10000;
                        countTotal(totalPrice);
                    } else {
                        holder.penalty_amt.setText(String.valueOf(AB));
                        totalPrice = totalPrice + AB;
                        countTotal(totalPrice);
                    }

                }
                if (!holder.toggleSwitch.isChecked()) {

                    int AC = bill.getTODATE();
                    int BC = Integer.parseInt(bill.getNILYES().toString());
                    int ABC = AC * BC;

                    totalPrice = totalPrice - ABC;

                    int A = bill.getTODATE();
                    int B = Integer.parseInt(bill.getNILNO().toString());
                    int AB = A * B;
                    if (AB >= 10000) {
                        holder.penalty_amt.setText("10000");
                        totalPrice = totalPrice + 10000;
                        countTotal(totalPrice);
                    } else {
                        holder.penalty_amt.setText(String.valueOf(AB));
                        totalPrice = totalPrice + AB;
                        countTotal(totalPrice);
                    }

                }

            }
        });

    

    }

    public void countTotal(int total){
        listener.onSubTotalUpdate(total);
    }



    @Override
    public int getItemCount() {

        return GstPlanListFiltered.size();
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    GstPlanListFiltered = GstPlanList;
                } else {
                    List<GstPlanList> filteredList = new ArrayList<>();
                    for (GstPlanList row : GstPlanList) {

                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getDate().toLowerCase().contains(charString.toLowerCase()) || row.getMonth().toLowerCase().contains(charString.toLowerCase()) || row.getRType().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(row);
                        }
                    }

                    GstPlanListFiltered = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = GstPlanListFiltered;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                GstPlanListFiltered = (ArrayList<GstPlanList>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

    public interface GstPlanListener {
      //  void onGstPlanSelected(GstPlanList bill);

         void onSubTotalUpdate(int total);
    }


}

GstPlanList



public class GstPlanList {

    private String RType;
    private String State;
    private String NILNO;
    private String NILYES;
    private String Month;
    private String Date;
    private String NIL;
    private int Penatly;
    private int TODATE;


    public GstPlanList() {
    }

    public Integer getPenatly() {
        return Penatly;
    }

    public int getTODATE() {
        return TODATE;
    }

    public String getNIL() {
        return NIL;
    }

    public String getRType() {
        return RType;
    }

    public String getState() {
        return State;
    }

    public String getNILNO() {
        return NILNO;
    }

    public String getNILYES() {
        return NILYES;
    }

    public String getMonth() {
        return Month;
    }

    public String getDate() {
        return Date;
    }

}


标签: javaandroidjsonandroid-recyclerview

解决方案


推荐阅读