1

Hi I have a RecycleView and an adapter with CheckBox that allow user to select multiple item in the Recycle view (checked item will be store in an ArrayList) Now I want to add another function that allow user to only choose 1 item in the Recycle view (only 1 checkbox is checked) (User can change the selection freely). How to implement this. Any help is much appreciate

Here is my apdater (for select multiple item) (I want to modify or add another adpater to allow user to select only 1 item, only 1 checkbox is checked at a time)

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

private Context context;
List <Event> events, eventSelected;

public EventAdapterAssign(Context context, List<Event> events, List<Event> eventSelected) {
    this.context = context;
    this.events = events;
    this.eventSelected = eventSelected;
}


@Override
public EventAdapterAssign.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);

    // Inflate the custom layout
    View eventView1 = inflater.inflate(R.layout.event_list_assign, parent, false);

    // Return a new holder instance
    ViewHolder viewHolder = new ViewHolder(eventView1);
    return viewHolder;
}

@Override
public void onBindViewHolder(EventAdapterAssign.ViewHolder holder, int position) {
    //Getting the particular item from the list
    final Event event = events.get(position);

    //Showing data on the views
    holder.EventTitle.setHint(event.getEventTitle());
    holder.EventDesc.setText(event.getEventDesc());
    holder.EventStartTime.setText(event.getEventStartTime());
    holder.EventEndTime.setText(event.getEventEndTime());
    holder.EventID.setText(event.getEventID());

    //in some case, it will prevent unwanted situations;
    holder.selectCheckBox.setOnCheckedChangeListener(null);

    //if true, your check box will be selected, else unselected
    holder.selectCheckBox.setChecked(event.isSelected());

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

            event.setIsSelected(isChecked);
            if (isChecked) {
                eventSelected.add(event);
            } else {
                eventSelected.remove(event);
            }
        }
    });

}

// Return the total count of items
@Override
public int getItemCount() {
    return events.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    //View
    public EditText EventTitle;
    public TextView EventDesc;
    public TextView EventStartTime;
    public TextView EventEndTime;
    public TextView EventID;
    public CheckBox selectCheckBox;

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

        // display Check In event when beacon in range

        EventTitle = (EditText)itemView.findViewById(R.id.EventTitle);
        EventDesc = (TextView)itemView.findViewById(R.id.EventDesc);
        EventStartTime = (TextView)itemView.findViewById(R.id.EventStartTime);
        EventEndTime = (TextView)itemView.findViewById(R.id.EventEndTime);
        EventID = (TextView)itemView.findViewById(R.id.EventID);

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

    }
}

and here is my data model (Event) class

public class Event implements Parcelable {
    private String EventID;
    private String EventDesc;
    private String EventTitle;
    private String EventStartTime;
    private String EventEndTime;

    private Context context;
    private boolean isSelected;

    public boolean isSelected() {
        return isSelected;
    }

    public void setIsSelected(boolean isSelected) {
        this.isSelected = isSelected;
    }

    public String getEventID() {
        return EventID;
    }

    public void setEventID(String eventID) {
        EventID = eventID;
    }

    public String getEventDesc() {
        return EventDesc;
    }

    public void setEventDesc(String eventDesc) {
        EventDesc = eventDesc;
    }

    public String getEventTitle() {
        return EventTitle;
    }

    public void setEventTitle(String eventTitle) {
        EventTitle = eventTitle;
    }

    public String getEventStartTime() {
        return EventStartTime;
    }

    public void setEventStartTime(String eventStartTime) {
        EventStartTime = eventStartTime;
    }

    public String getEventEndTime() {
        return EventEndTime;
    }

    public void setEventEndTime(String eventEndTime) {
        EventEndTime = eventEndTime;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.EventID);
        dest.writeString(this.EventDesc);
        dest.writeString(this.EventTitle);
        dest.writeString(this.EventStartTime);
        dest.writeString(this.EventEndTime);
    }

    public Event() {
    }

    protected Event(Parcel in) {
        this.EventID = in.readString();
        this.EventDesc = in.readString();
        this.EventTitle = in.readString();
        this.EventStartTime = in.readString();
        this.EventEndTime = in.readString();
    }

    public static final Parcelable.Creator<Event> CREATOR = new Parcelable.Creator<Event>() {
        public Event createFromParcel(Parcel source) {
            return new Event(source);
        }

        public Event[] newArray(int size) {
            return new Event[size];
        }
    };


}
Ghasem
  • 14,455
  • 21
  • 138
  • 171
Lê Khánh Vinh
  • 2,591
  • 5
  • 31
  • 77

2 Answers2

1
    public class EventAdapterAssign extends RecyclerView.Adapter<EventAdapterAssign.ViewHolder> {

     private Context context;
            List <Event> events, eventSelected;
                private SparseBooleanArray mSparseBooleanArray;
        public  int selectedPosition;
            public EventAdapterAssign(Context context, List<Event> events, List<Event> eventSelected) {
                this.context = context;
                this.events = events;
                this.eventSelected = eventSelected;
        mSparseBooleanArray = new SparseBooleanArray();    
        }


            @Override
            public EventAdapterAssign.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                Context context = parent.getContext();
                LayoutInflater inflater = LayoutInflater.from(context);

                // Inflate the custom layout
                View eventView1 = inflater.inflate(R.layout.event_list_assign, parent, false);

                // Return a new holder instance
                ViewHolder viewHolder = new ViewHolder(eventView1);
                return viewHolder;
            }

            @Override
            public void onBindViewHolder(EventAdapterAssign.ViewHolder holder, int position) {
                //Getting the particular item from the list
                 Event event = events.get(position);

                //Showing data on the views
                holder.EventTitle.setHint(event.getEventTitle());
                holder.EventDesc.setText(event.getEventDesc());
                holder.EventStartTime.setText(event.getEventStartTime());
                holder.EventEndTime.setText(event.getEventEndTime());
                holder.EventID.setText(event.getEventID());

                //in some case, it will prevent unwanted situations;
                holder.selectCheckBox.setOnCheckedChangeListener(null);

                //if true, your check box will be selected, else unselected

            holder.selectCheckBox.setTag(position);

            if(position==selectedPosition)
            {
            holder.selectCheckBox.setChecked(true);
            }
            else
            {
            holder.selectCheckBox.setChecked(false);
            }
                holder.selectCheckBox.setOnCheckedChangeListener(new CheckListener(holder.selectCheckBox,position));

            }

            // Return the total count of items
            @Override
            public int getItemCount() {
                return events.size();
            }

            class CheckListener implements OnCheckedChangeListener {

                    private CheckBox checkbox;
            Event data;
                    public CheckListener(CheckBox checkbox,int position) {

                        this.checkbox = checkbox;
                this.position=position;

                    }

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

                        if (isChecked) {
                            checkbox.setChecked(true);
            selectedPosition = position;
   EventAdapterAssign.this.notifyDataSetChanged();
                        } else {
                            checkbox.setChecked(false);

                        }
                        buttonView.setChecked(isChecked);

                    }


                }

        public Event getCheckedItems() {


                return event.get(selectedPosition);
            }

            public class ViewHolder extends RecyclerView.ViewHolder {
                //View
                public EditText EventTitle;
                public TextView EventDesc;
                public TextView EventStartTime;
                public TextView EventEndTime;
                public TextView EventID;
                public CheckBox selectCheckBox;

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

                    // display Check In event when beacon in range

                    EventTitle = (EditText)itemView.findViewById(R.id.EventTitle);
                    EventDesc = (TextView)itemView.findViewById(R.id.EventDesc);
                    EventStartTime = (TextView)itemView.findViewById(R.id.EventStartTime);
                    EventEndTime = (TextView)itemView.findViewById(R.id.EventEndTime);
                    EventID = (TextView)itemView.findViewById(R.id.EventID);

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

                }
            }
Rohit Heera
  • 2,709
  • 2
  • 21
  • 31
  • Once again thanks a lot for yrs help. I'll check again. Checkbox with recycle view is a bit tricky. Is there any better apprach to get user select an object from a list of object? – Lê Khánh Vinh Dec 28 '15 at 12:36
  • 1
    Can take a look at the class class CheckListener implements OnCheckedChangeListener? I got 2 error with 2 line of code selectedPosition = position; EventAdapterAssign.this.notifyDataSetChanged(); – Lê Khánh Vinh Dec 28 '15 at 18:15
  • may be we have some problem with the class class CheckListener – Lê Khánh Vinh Dec 29 '15 at 02:16
  • yes selectedPosition = position; this assignment should be done in the true field can you plz again try the new code once – Rohit Heera Dec 29 '15 at 05:23
  • It almost working. I have made a small change in the class. now select one item at a time (old checked item will become unchecked). but still can not get the checked Item to further processing. Here is my complete adater again. https://docs.google.com/document/d/16APWQippnSNr0_BWqDQd36kzRA6IpbsLSHKIt0xgEFY/edit – Lê Khánh Vinh Dec 29 '15 at 06:44
  • I delare 1 int position in class CheckListener implements CompoundButton.OnCheckedChangeListener { private CheckBox checkbox; Event data; int position; – Lê Khánh Vinh Dec 29 '15 at 06:45
  • may be can put this code somewhere to get the cheked item eventSelected = getCheckedItems(); – Lê Khánh Vinh Dec 29 '15 at 06:48
  • You need to cal this method using adapter object in activity – Rohit Heera Dec 29 '15 at 07:05
  • so these line lass CheckListener implements OnCheckedChangeListener { private CheckBox checkbox; Event data; public CheckListener(CheckBox checkbox,int position) { this.checkbox = checkbox; this.position=position; }. I dont see the declaration Event data used for and also missing delaration of int posistion? Am I correct – Lê Khánh Vinh Dec 29 '15 at 07:09
  • actually we can pass position in constructor and when you select a check box which is unchecked than a postion is stored in selectedPosition variable – Rohit Heera Dec 29 '15 at 07:12
  • @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { checkbox.setChecked(true); selectedPosition = position; EventAdapterAssign.this.notifyDataSetChanged(); } else { checkbox.setChecked(false); } buttonView.setChecked(isChecked); } – Rohit Heera Dec 29 '15 at 07:13
  • we can not call adapter.getCheckItem() there is only getItemCount() may be have to assign class variable in the adpater instead? – Lê Khánh Vinh Dec 29 '15 at 07:21
  • how you can populate the list it – Rohit Heera Dec 29 '15 at 07:23
  • I make a requestQueue using Volley to server and construct List Listevents inside Onrespond method and use adapter.notifidatasetchange() to update the view – Lê Khánh Vinh Dec 29 '15 at 07:26
  • the behavior is quite what desire, just only how to properly get the checked Item for further processing – Lê Khánh Vinh Dec 29 '15 at 07:27
  • Hi Is there any way to get the checked Item properly? – Lê Khánh Vinh Dec 30 '15 at 03:21
  • Actually you have the position of selected item from that position us get the selected item from the list – Rohit Heera Dec 30 '15 at 05:28
  • you mean the method getCheckedItem()? but how to get it from fragment, activity? – Lê Khánh Vinh Dec 30 '15 at 05:33
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/99279/discussion-between-rohit-heera-and-le-khanh-vinh). – Rohit Heera Dec 30 '15 at 05:53
0

Try this

 private Context context;
   List <Event> events, eventSelected;
   private SparseBooleanArray mSparseBooleanArray;

        public EventAdapterAssign(Context context, List<Event> events, List<Event> eventSelected) {
            this.context = context;
            this.events = events;
            this.eventSelected = eventSelected;
    mSparseBooleanArray = new SparseBooleanArray();    
    }


        @Override
        public EventAdapterAssign.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            Context context = parent.getContext();
            LayoutInflater inflater = LayoutInflater.from(context);

            // Inflate the custom layout
            View eventView1 = inflater.inflate(R.layout.event_list_assign, parent, false);

            // Return a new holder instance
            ViewHolder viewHolder = new ViewHolder(eventView1);
            return viewHolder;
        }

        @Override
        public void onBindViewHolder(EventAdapterAssign.ViewHolder holder, int position) {
            //Getting the particular item from the list
             Event event = events.get(position);

            //Showing data on the views
            holder.EventTitle.setHint(event.getEventTitle());
            holder.EventDesc.setText(event.getEventDesc());
            holder.EventStartTime.setText(event.getEventStartTime());
            holder.EventEndTime.setText(event.getEventEndTime());
            holder.EventID.setText(event.getEventID());

            //in some case, it will prevent unwanted situations;
            holder.selectCheckBox.setOnCheckedChangeListener(null);

            //if true, your check box will be selected, else unselected

        holder.selectCheckBox.setTag(position);

        if(event.isSelected())
        {
        holder.selectCheckBox.setChecked(true);
        }
        else
        {
        holder.selectCheckBox.setChecked(false);
        }
            holder.selectCheckBox.setOnCheckedChangeListener(new CheckListener(event,holder.selectCheckBox));

        }

        // Return the total count of items
        @Override
        public int getItemCount() {
            return events.size();
        }

        class CheckListener implements OnCheckedChangeListener {

                private CheckBox checkbox;
        Event data;
                public CheckListener(Event data, CheckBox checkbox) {

                    this.checkbox = checkbox;
                    this.data = data;

                }

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

                    if (isChecked) {
                        checkbox.setChecked(true);

                    } else {
                        checkbox.setChecked(false);

                    }
                    buttonView.setChecked(isChecked);
        data.setIsSelected(isChecked);
                }

            }

    public ArrayList<Event> getCheckedItems() {
            ArrayList<Event> mTempArry = new ArrayList<Event>();

            for (int i = 0; i < mList.size(); i++) {
                if (mSparseBooleanArray.get(i)) {

                    Event data = events.get(i);

                    mTempArry.add(data);
                }
            }

            return mTempArry;
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            //View
            public EditText EventTitle;
            public TextView EventDesc;
            public TextView EventStartTime;
            public TextView EventEndTime;
            public TextView EventID;
            public CheckBox selectCheckBox;

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

                // display Check In event when beacon in range

                EventTitle = (EditText)itemView.findViewById(R.id.EventTitle);
                EventDesc = (TextView)itemView.findViewById(R.id.EventDesc);
                EventStartTime = (TextView)itemView.findViewById(R.id.EventStartTime);
                EventEndTime = (TextView)itemView.findViewById(R.id.EventEndTime);
                EventID = (TextView)itemView.findViewById(R.id.EventID);

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

            }
        }
Bee
  • 142
  • 17
Rohit Heera
  • 2,709
  • 2
  • 21
  • 31
  • thanks a lot for your respond. But I how do i get the eventselected event item after user has complete choose item form checkbox? – Lê Khánh Vinh Dec 28 '15 at 06:09
  • I can update the answer now you get all the selected items by calling getCheckedItems() method – Rohit Heera Dec 28 '15 at 06:16
  • Hi how to import ContactSyncRespond and mList? seem missing declaration? public ArrayList getCheckedItems() { ArrayList mTempArry = new ArrayList(); for (int i = 0; i < mList.size(); i++) { if (mSparseBooleanArray.get(i)) { ContactSynResponse data = mList.get(i); mTempArry.add(data); } } return mTempArry; } – Lê Khánh Vinh Dec 28 '15 at 06:32
  • the method getCheckedItem() seem to have some problem? – Lê Khánh Vinh Dec 28 '15 at 07:04
  • is that mList : List events? (List of event from class declaration?) or new variable? – Lê Khánh Vinh Dec 28 '15 at 07:17
  • use events list variable instead of mList – Rohit Heera Dec 28 '15 at 07:18
  • how to call the method getCheckedItem() when inside activity,fragment? seem can not add static parameter for it – Lê Khánh Vinh Dec 28 '15 at 07:51
  • seem not working as I scroll the recycle view. all the checked item become unchecked. – Lê Khánh Vinh Dec 28 '15 at 07:57
  • the checked item still become uncheck whenever user scroll . here is my adapter code. Is there something wrong? https://docs.google.com/document/d/16APWQippnSNr0_BWqDQd36kzRA6IpbsLSHKIt0xgEFY/edit – Lê Khánh Vinh Dec 28 '15 at 09:27
  • Yes you need to update the Item IsSelected Value my answer again i can update the dataas well in CheckChangeListner class please take a look – Rohit Heera Dec 28 '15 at 10:20
  • @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { checkbox.setChecked(true); } else { checkbox.setChecked(false); } buttonView.setChecked(isChecked); data.setIsSelected(isChecked); } – Rohit Heera Dec 28 '15 at 10:20
  • very strange situation now user can select multiple check box (not only one(mean user select another checkbox, the item already checked remain checked, suppose to be unchecked) my complete adapter again. https://docs.google.com/document/d/16APWQippnSNr0_BWqDQd36kzRA6IpbsLSHKIt0xgEFY/edit. – Lê Khánh Vinh Dec 28 '15 at 10:36
  • Now What is your requirement exactly – Rohit Heera Dec 28 '15 at 10:51
  • I just want the recycle view to allow user to select only 1 item at a time and get that item for further processing (for example if user check new item, the old checked one should change to uncheck state) – Lê Khánh Vinh Dec 28 '15 at 10:54
  • I can post another answer according to your requirement – Rohit Heera Dec 28 '15 at 12:29