1

I am trying to get values of the selected checkbox on my app. I want to get the items checked by the user in the app and send the items to the server. I have tried doing it but I dont know how do I go about it?

Adapter

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

Context context;
private List<Problems> mDataset;
private static final int TYPE_HEADER = 0;
private static final int TYPE_FOOTER = 1;
private static final int TYPE_ITEM = 2;
private ProblemListener setProblemListener;
CardView cv;

public void setProblemListener(ProblemListener problemListener){
    this.setProblemListener = problemListener;
}
public class ViewHolder extends RecyclerView.ViewHolder{
    public TextView tvProblems, tvPrice;
    public Button btnProblem;
    Button btnSubmitProblem;
    CheckBox cbProblems;

    public ViewHolder(View itemView) {
        super(itemView);
        tvProblems = (TextView) itemView.findViewById(R.id.tvProblems);
        tvPrice = (TextView) itemView.findViewById(R.id.tvPrice);
        btnSubmitProblem = (Button) itemView.findViewById(R.id.btnProblems);
        cbProblems = (CheckBox) itemView.findViewById(R.id.cbProblems);

       overrideFonts(context, tvProblems);
    }
}
private void overrideFonts(final Context context, final View v) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideFonts(context, child);
            }
        } else if (v instanceof TextView ) {
            ((TextView) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/RobotoCondensedBold.ttf"));
        }
    } catch (Exception e) {
    }
}

public void add(List<Problems> itemList){
    mDataset = itemList;
    notifyDataSetChanged();
}

public void remove(Problems item){
    int position = mDataset.indexOf(item);
    mDataset.remove(position);
    notifyItemRemoved(position);
}

public MyAdapter(Context con, List<Problems> myDataset){
    mDataset = myDataset;
    this.context = con;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


    View itemView;
    if (viewType == TYPE_ITEM) {
        //Inflating recycle view item layout
        itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.problem_content, parent, false);
        return new ItemViewHolder(itemView);

    } else if (viewType == TYPE_HEADER) {
        //Inflating header view
        itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.problem_recycler_header, parent, false);
        return new HeaderViewHolder(itemView);
    } else if (viewType == TYPE_FOOTER) {
        //Inflating footer view
        itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.problem_recycler_footer, parent, false);
        return new FooterViewHolder(itemView);
    }
    throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");
}

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

    try {
    if (holder instanceof HeaderViewHolder) {

        HeaderViewHolder headerHolder = (HeaderViewHolder) holder;
        headerHolder.tvHeader.setText("Please kindly ask the mechanic what the problem is and check them to continue");

    } else {
        if (holder instanceof FooterViewHolder) {

            final FooterViewHolder footerHolder = (FooterViewHolder) holder;
            footerHolder.btnSubmitProblem.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  //  footerHolder.cbProblems.setOnClickListener(null);
                   setProblemListener.onProblemSelected(v, mDataset, position);

                }
            });

        } else if (holder instanceof ItemViewHolder) {
            ItemViewHolder itemView = (ItemViewHolder) holder;

            //in some cases, it will prevent unwanted situations
            itemView.cbProblems.setOnCheckedChangeListener(null);

            //if true, your checkbox will be selected, else unselected
            itemView.cbProblems.setChecked(mDataset.get(position-1).isSelected());

            itemView.tvPrice.setText(mDataset.get(position - 1).getPrice());
            itemView.tvProblems.setText(mDataset.get(position - 1).getProblems());


            itemView.cbProblems.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    if (buttonView.isPressed()){
                        mDataset.get(position - 1).setSelected(isChecked);
                        Toast.makeText(context, "postion " + position + "Boolean value " + Boolean.valueOf(isChecked), Toast.LENGTH_SHORT).show();;
                    }

                }
            });

        }
    }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
public int getItemCount() {
    return mDataset.size()+2;
}

public int getItemViewType(int position) {

    if (position == 0) {
        return TYPE_HEADER;
    } else if (position == mDataset.size() + 1) {
        return TYPE_FOOTER;
    }
    return TYPE_ITEM;
}

private class HeaderViewHolder extends MyAdapter.ViewHolder {
    TextView tvHeader;

    public HeaderViewHolder(View view) {
        super(view);
        tvHeader = (TextView) view.findViewById(R.id.tvHeader);
        overrideFonts(context, tvHeader);
    }
}

private class FooterViewHolder extends MyAdapter.ViewHolder {
    Button btnSubmitProblem;
    CheckBox cbProblems;


    public FooterViewHolder(View view) {
        super(view);
        btnSubmitProblem = (Button) view.findViewById(R.id.btnProblems);
        cbProblems = (CheckBox) itemView.findViewById(R.id.cbProblems);
    }
}

private class ItemViewHolder extends MyAdapter.ViewHolder {
    TextView tvProblems, tvPrice;

    public ItemViewHolder(View itemView) {
        super(itemView);
        tvProblems = (TextView) itemView.findViewById(R.id.tvProblems);
        tvPrice = (TextView) itemView.findViewById(R.id.tvPrice);
        cv = (CardView)itemView.findViewById(R.id.cards);

    }
}

private class CheckboxViewHolder extends MyAdapter.ViewHolder {
    public CheckboxViewHolder(View itemView) {
        super(itemView);
        cbProblems = (CheckBox) itemView.findViewById(R.id.cbProblems);

    }
}
public interface ProblemListener{
    void onProblemSelected(View view, List<Problems> problem, int position);
}

}

MainActivity

public class ProblemsActivity extends AppCompatActivity {

private String PROBLEM_URL = MYURL.url + "get-problems";

CardView cardView;
CheckBox breakCheckBox;
private ListView getListValue, listView;
SharedPreferences sharedPreferences;
Button btnSubmitProblems;
String problems;
List<Problems> listProblems = new ArrayList<>();
DividerItemDecoration mDividerItemDecoration;
Toolbar toolbar;
private double price = 0.0;
private RecyclerView mRecyclerView;
 MyAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
/**
 * ATTENTION: This was auto-generated to implement the App Indexing API.
 * See https://g.co/AppIndexing/AndroidStudio for more information.
 */


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_problems);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    toolbar.setTitleTextColor(Color.parseColor("#FFFFFF"));
    if (getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
    mRecyclerView = (RecyclerView) findViewById(R.id.problem_recycle_view);
    mRecyclerView.setHasFixedSize(true);

    mLayoutManager = new LinearLayoutManager(ProblemsActivity.this, LinearLayoutManager.VERTICAL, false);
    mRecyclerView.setLayoutManager(mLayoutManager);


    mAdapter = new MyAdapter(ProblemsActivity.this, listProblems);

    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
    StringRequest stringRequest = new StringRequest(Request.Method.GET, PROBLEM_URL, new com.android.volley.Response.Listener<String>() {

        @Override
        public void onResponse(String response)
        {
            mRecyclerView.setAdapter(mAdapter);
            JSONParse jsonParse = new JSONParse(response);
            jsonParse.parseJSON();
            listProblems = jsonParse.getProblems();
            mAdapter.add(listProblems);
            mAdapter.notifyDataSetChanged();
        }

    }, new com.android.volley.Response.ErrorListener() {

        @Override

        public void onErrorResponse(VolleyError error) {
            Log.i("Info", "Failed");
            error.printStackTrace();

        }

    });
    int socketTimeout = 30000;
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    stringRequest.setRetryPolicy(policy);
    requestQueue.add(stringRequest);

    mRecyclerView.addItemDecoration(new DividerItemDecoration(ProblemsActivity.this, LinearLayoutManager.HORIZONTAL));
    mAdapter.setProblemListener(new MyAdapter.ProblemListener() {
        @Override
        public void onProblemSelected(View view, List<Problems> problem, int position) {

        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.logout){

        SharedPreferences preferences = getSharedPreferences("Mypref", 0);
        preferences.edit().clear().commit();
        Intent intent = new Intent(ProblemsActivity.this, HomeActivity.class); // Create an Intent
        startActivity(intent); // Move to Verification Activity
 Toast.LENGTH_SHORT).show();
    }else if (id == android.R.id.home){
        finish();
    }
    return super.onOptionsItemSelected(item);
}

 }

I have been thinking on how to do that for days now but I cant figure out how to go about it. Anyone to help me please.

user2940930
  • 93
  • 1
  • 9

3 Answers3

1

You are saving the checked status in the list so on the submit click you can just iterate the list and get the selected ones like:

mAdapter.setProblemListener(new MyAdapter.ProblemListener() {
    @Override
    public void onProblemSelected(View view, List<Problems> problem, int position) {
     List<Problems> selectedProblems=new ArrayList();
     for(Problems item: problem)
     {
       if(item.isSelected())
        {
         selectedProblems.add(item);
        }
     }
     sendToServer(selectedProblems);
    }
});

This way you will get the selected items and can implement the send to server logic you have.

One issue with your code in the recycler view adapter is you are only setting the selected status when the item is selected, but the item can be unselected too as it's a checkbox so you also have to change the selected status when the item is unselected, you can simply remove the if condition and do this,

itemView.cbProblems.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    mDataset.get(position - 1).setSelected(isChecked);
                    Toast.makeText(context, "postion " + position + "Boolean value " + Boolean.valueOf(isChecked), Toast.LENGTH_SHORT).show();;


            }
        });
Harshith Shetty
  • 351
  • 4
  • 10
0
checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

                        if(isChecked){
                        //do what you want to do on checkbox checked 
                         }else{
                          }
        }
        }

implement like this in the adapter.

AAA
  • 485
  • 6
  • 23
0

In your adapter i.e FooterViewHolder add the OnCheckedChangeListener. When checked or unchecked it will be triggered. Similarly you may have to add in the FooterViewHolder as well.

private class FooterViewHolder extends MyAdapter.ViewHolder {
    Button btnSubmitProblem;
    CheckBox cbProblems;

    public FooterViewHolder(View view) {
        super(view);
        btnSubmitProblem = (Button) view.findViewById(R.id.btnProblems);
        cbProblems = (CheckBox) itemView.findViewById(R.id.cbProblems);

        cbProblems.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if(b){
                  //checked do something                      
                 }
            }
        });
    }
}
Psypher
  • 10,717
  • 12
  • 59
  • 83