如果取消选中我的recyclerview中的所有复选框,如何显示吐司?

时间:2018-01-23 23:44:20

标签: java android checkbox android-recyclerview

我最接近的是在取消选中每个toast后显示checkbox,但我希望仅在取消选中所有之后显示toast 。在我的onBindViewHolder我有:

    ((MatchingContact) viewHolder).check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        // ((MatchingContact) viewHolder).check.setOnClickListener(new CompoundButton.OnClickListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked==false) {
                Toast.makeText(context_type, "all unchecked!", Toast.LENGTH_SHORT).show();


            }

        }
    });

这是我的Activity,NewContact.java,代码(在下面的评论中提出请求后):

    public class NewContact extends AppCompatActivity  {

        //in this JSONArray, checkedContacts, we will be storing each checkedContact JSON Object
        //Then we're going to post it to our NewContact.php file
        JSONArray checkedContacts = new JSONArray();

        Button phoneContacts;
        CheckBox mcheckbox;

        //thse are the fields in the xml
        private EditText categoryname;
        private EditText namename;
        private EditText phonename;
        private EditText addressname;
        private EditText commentname;

        int public_or_private;

        // ArrayList called selectPhoneContacts that will contain SelectPhoneContact info
        ArrayList<SelectPhoneContact> selectPhoneContacts;

        ArrayList<String> allPhonesofContacts;
        ArrayList<String> allNamesofContacts;
        ArrayList<String> MatchingContactsAsArrayList;
        String phoneNoofUserCheck;
        public String phoneNumberofContact;
        String phoneNameofContact;

        //For the recycler view, containing the phone contacts
        RecyclerView recyclerView;
        PopulistoContactsAdapter adapter;

        int check_counter = 0;

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

            PopulistoContactsAdapter adapter = new PopulistoContactsAdapter(selectPhoneContacts, NewContact.this);

            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            //we are fetching details for the recyclerview - the name, numbers, matching contacts...
            LoadContact loadContact = new LoadContact();
            loadContact.execute();

            //selectPhoneContacts is an empty array list that will hold our SelectPhoneContact info
            selectPhoneContacts = new ArrayList<SelectPhoneContact>();

            recyclerView = (RecyclerView) findViewById(R.id.rv);

            //cast an EditText for each of the field ids in activity_new_contactact.xml
            categoryname = (EditText) findViewById(R.id.textViewCategory);
            namename = (EditText) findViewById(R.id.textViewName);
            phonename = (EditText) findViewById(R.id.textViewPhone);
            addressname = (EditText) findViewById(R.id.textViewAddress);
            commentname = (EditText) findViewById(R.id.textViewComment);

            phoneContacts = (Button) findViewById(R.id.btnPhoneContacts);

            phoneContactsButton();
            checkboxnull();

            public_or_private = 1;

        }

        // Load data in background
        class LoadContact extends AsyncTask<Void, Void, Void> {
            @Override
            protected void onPreExecute() {

                super.onPreExecute();
            }


            @Override
            protected Void doInBackground(Void... voids) {

                //code here to get allPhonesofContacts
                allPhonesofContacts = gson.fromJson(json, type);

                //code here to get allNamesofContacts
                allNamesofContacts = gson.fromJson(jsonNames, type);
                System.out.println("NewContact: allNamesofContacts :" + allNamesofContacts);

                //code here to get MatchingContactsAsArrayList 
                MatchingContactsAsArrayList = gsonMatchingContactsAsArrayList.fromJson(jsonMatchingContactsAsArrayList, type1);
                System.out.println("SelectPhoneContactAdapter MatchingContactsAsArrayList :" + MatchingContactsAsArrayList);

                //for every value in the allPhonesofContacts array list, call it phoneNumberofContact
                for (int i = 0; i < allPhonesofContacts.size(); i++) {

                    phoneNumberofContact = allPhonesofContacts.get(i);
                    phoneNameofContact = allNamesofContacts.get(i);

                    SelectPhoneContact selectContact = new SelectPhoneContact();

                    //if a phone number is in our array of matching contacts
                    if (MatchingContactsAsArrayList.contains(phoneNumberofContact))

                    {   //add the selectContacts to the selectPhoneContacts array
                        // insert the contact at the beginning of the listview
                        selectPhoneContacts.add(0, selectContact);

                        //In SelectContact class, so getItemViewType will know which layout to show
                        selectContact.setType_row("1");


                    } else {
                        // insert it at the end (default)
                        selectPhoneContacts.add(selectContact);
                        selectContact.setType_row("2");


                    }

                    selectContact.setName(phoneNameofContact);
                    selectContact.setPhone(phoneNumberofContact);

                }

                return null;

            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);

                PopulistoContactsAdapter adapter = new PopulistoContactsAdapter(selectPhoneContacts, NewContact.this);

                recyclerView.setAdapter(adapter);
                recyclerView.setLayoutManager((new LinearLayoutManager(NewContact.this)));

  adapter.notifyDataSetChanged();


            }
        }


        @Override
        protected void onResume() {
            super.onResume();

        }

        //for the Public Contacts button
        private void phoneContactsButton() {

            phoneContacts.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {

                    PopulistoContactsAdapter adapter = new PopulistoContactsAdapter(selectPhoneContacts, NewContact.this);

                    recyclerView.setAdapter(adapter);
                    // recyclerView.setLayoutManager((new LinearLayoutManager(NewContact.this)));

                    //loop through the matching contacts
                    int count = PopulistoContactsAdapter.theContactsList.size();

                    for (int i = 0; i < count; i++) {

                        //for  contacts that are checked (they can only be matching contacts)...
                        //PopulistoContactsAdapter.theContactsList.get(i).isSelected=true;
                        PopulistoContactsAdapter.theContactsList.get(i).setSelected(true);


                        //we need to notify the recyclerview that changes may have been made
                        adapter.notifyDataSetChanged();
                    }
                }


            });

        }

        private void checkboxnull() {


            //adapter.setOnClickListener(new PopulistoContactsAdapter.OnClickListener() {
             PopulistoContactsAdapter adapter = new PopulistoContactsAdapter(selectPhoneContacts, NewContact.this);


                adapter.SetOnCheckBoxClickListener(new PopulistoContactsAdapter.OnCheckBoxClickListener() {


                @Override
                public void onCheckBoxClick(boolean isChecked) {
                    if (isChecked)
                        ++check_counter;
                    else
                        --check_counter;


                    if (check_counter <= 0)
                        Toast.makeText(NewContact.this, "all unchecked!", Toast.LENGTH_SHORT).show();


                }


            });
        }


        //create a method in your first activity, (where the button color should change):
        public void changeColorInFirstActivity(){
           // Button btnA = (Button) findViewById(R.id.btnPhoneContacts);
            phoneContacts.setBackgroundColor(Color.RED);
        }
}

我的适配器:

public class PopulistoContactsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder > {
        private Context mContext;
        //make a List containing info about SelectPhoneContact objects
        public static List<SelectPhoneContact> theContactsList;
        Context context_type;
        private OnCheckBoxClickListener onCheckBoxClickListener;

        public class MatchingContact extends RecyclerView.ViewHolder {

            //In each recycler_blueprint show the items you want to have appearing
            public TextView title, phone;
            public CheckBox check;
            public Button invite;

            public MatchingContact(final View itemView) {
                super(itemView);
                //title is cast to the name id, in recycler_blueprint,
                //phone is cast to the id called no etc
                title = (TextView) itemView.findViewById(R.id.name);
                phone = (TextView) itemView.findViewById(R.id.no);
                invite = (Button) itemView.findViewById(R.id.btnInvite);
                check = (CheckBox) itemView.findViewById(R.id.checkBoxContact);

            }

        }


        public class nonMatchingContact extends RecyclerView.ViewHolder {

            //In each recycler_blueprint show the items you want to have appearing
            public TextView title, phone;
            public CheckBox check;
            public Button invite;

            public nonMatchingContact(final View itemView) {
                super(itemView);
                //title is cast to the name id, in recycler_blueprint,
                //phone is cast to the id called no etc
                title = (TextView) itemView.findViewById(R.id.name);
                phone = (TextView) itemView.findViewById(R.id.no);
                invite = (Button) itemView.findViewById(R.id.btnInvite);
                check = (CheckBox) itemView.findViewById(R.id.checkBoxContact);

            }

        }

        @Override
        public int getItemViewType(int position) {
            //for each row in recyclerview, get the getType_row, set in NewContact.java
            return Integer.parseInt(theContactsList.get(position).getType_row());
        }

        public PopulistoContactsAdapter(List<SelectPhoneContact> selectPhoneContacts, Context context) {
            //selectPhoneContacts = new ArrayList<SelectPhoneContact>();


            theContactsList = selectPhoneContacts;


            this.mContext = context;
           // whichactivity = activity;
            context_type = context;


        }

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

            View itemView;

            //if getType_row is 1...
            if (viewType == 1)


            {


                Context context = parent.getContext();
                LayoutInflater inflater = LayoutInflater.from(context);


                itemView = inflater.inflate(R.layout.recycler_blueprint, parent, false);

                //itemView.setTag();
                return new MatchingContact(itemView);


            } else {


                Context context = parent.getContext();
                LayoutInflater inflater = LayoutInflater.from(context);


                itemView = inflater.inflate(R.layout.recycler_blueprint_non_matching, parent, false);


                return new nonMatchingContact(itemView);


            }


        }


        @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {
            //bind the views into the ViewHolder
            //selectPhoneContact is an instance of the SelectPhoneContact class.
            //We will assign each row of the recyclerview to contain details of selectPhoneContact:


            //The number of rows will match the number of phone contacts
            final SelectPhoneContact selectPhoneContact = theContactsList.get(position);


            //if the row is a matching contact
            if (viewHolder.getItemViewType() == 1)


            {
                //in the title textbox in the row, put the corresponding name etc...
                ((MatchingContact) viewHolder).title.setText(selectPhoneContact.getName());
                ((MatchingContact) viewHolder).phone.setText(selectPhoneContact.getPhone());
                ((MatchingContact) viewHolder).check.setChecked(theContactsList.get(position).getSelected());
                ((MatchingContact) viewHolder).check.setTag(position);


                ((MatchingContact) viewHolder).check.setOnClickListener(new View.OnClickListener() {


                    @Override
                    public void onClick(View v) {


                        //pos is the row number that the clicked checkbox exists in
                        Integer pos = (Integer) ((MatchingContact) viewHolder).check.getTag();


                        //NEED THIS TO PRESERVE CHECKBOX STATE
                        //because it is onClick, getSelected will always be the same value
                        //false or true, it doesn't matter
                        if (theContactsList.get(pos).getSelected()) {
                            theContactsList.get(pos).setSelected(false);
                            Toast.makeText(context_type, theContactsList.get(pos).getPhone() + " clicked!", Toast.LENGTH_SHORT).show();


                        } else {


                            theContactsList.get(pos).setSelected(true);
                            Toast.makeText(context_type, theContactsList.get(pos).getPhone() + " unclicked!", Toast.LENGTH_SHORT).show();


                        }
                    }
                });


                ((MatchingContact) viewHolder).check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    // ((MatchingContact) viewHolder).check.setOnClickListener(new CompoundButton.OnClickListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


                        onCheckBoxClickListener.onCheckBoxClick(isChecked);


                    }
                });


            }
            else {


                ((nonMatchingContact) viewHolder).title.setText(selectPhoneContact.getName());
                ((nonMatchingContact) viewHolder).phone.setText(selectPhoneContact.getPhone());


            }
        }

        @Override
        public int getItemCount() {


            return theContactsList.size();
        }


        public interface OnCheckBoxClickListener {
            void onCheckBoxClick(boolean ischecked);
        }


        public void SetOnCheckBoxClickListener(final OnCheckBoxClickListener onCheckBoxClickListener) {
            this.onCheckBoxClickListener = onCheckBoxClickListener;
        }


    }

3 个答案:

答案 0 :(得分:1)

您可以使用全局变量来存储所选复选框的计数,然后在每次检查更改事件时更新计数(基于选中的值添加或子结构),然后在更新后计数为0 ,所有复选框都未选中

类似的东西:

//if all the checkboxes are cheked by default
int count = theContactsList.size();
//if all the checkboxes are uncheked by defult
int count = 0;

((MatchingContact) viewHolder).check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
{
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
    {
        if (!isChecked)
        {
              count--;
        }
        else
        {
              count++;
        }
        if(count<=0)
        {
            //all unchcked
        }

    }
});

答案 1 :(得分:1)

使用界面

Adapter

中定义此界面
private OnCheckBoxClickListener onCheckBoxClickListener;

public interface OnCheckBoxClickListener {
    void onCheckBoxClick(boolean ischecked);
}

添加

public void SetOnCheckBoxClickListener(final OnCheckBoxClickListener onCheckBoxClickListener) {
    this.onCheckBoxClickListener = onCheckBoxClickListener;
}

更新onBindViewHolder

((MatchingContact) viewHolder).check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    // ((MatchingContact) viewHolder).check.setOnClickListener(new CompoundButton.OnClickListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        onCheckBoxClickListener.onCheckBoxClick(isChecked);

    }
});
Activity/Fragment

中的

int check_counter = 0;

    mAdapter.SetOnCheckBoxClickListener(new YourAdapterClass.OnCheckBoxClickListener() {
        @Override
        public void onCheckBoxClick(boolean ischecked) {
            if (ischecked)
                ++check_counter;
            else
                --check_counter;

            if (check_counter <= 0)
                Toast.makeText(context, "all unchecked!", Toast.LENGTH_SHORT).show();


        }

    });

答案 2 :(得分:0)

我设法使用onClickListener

在我的:

    ((MatchingContact) viewHolder).check.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {



        }
    });

我说:

                int count = 0;
                int size = theContactsList.size();
                for (int i = 0; i < size; i++) {
                    if (theContactsList.get(i).isSelected) {
                        count++;
                    }
                }
                if(count==0) {
                    Toast.makeText(context_type, "All unchecked!" , Toast.LENGTH_SHORT).show();
                }