[英]object is not getting removed from list onCheckedChange listener of check box
我有一個聯系人列表。 我有一個復選框來選擇聯系人。 我想將這些選定的聯系人添加到另一個稱為邀請數組列表的列表中。 我已經創建了一種方法,如果選中復選框,則將其添加到邀請列表中的所有聯系人,稱為toogleContactsSelection。 我在活動中使用的。
如果選中了復選框,我已經創建了另一種在邀請arraylist中添加聯系人的方法。
現在,如果未選中復選框,即復選框的onCheckChangeListener,我想從邀請數組列表中刪除對象。
但是對象沒有從邀請數組列表中刪除。
適配器:
public class InviteAdapter extends RecyclerView.Adapter<InviteAdapter.MyViewHolder> {
private ArrayList<Contact> contactArrayList;
private Context mContext;
public ArrayList<Invitation> invitationArrayList = new ArrayList<>();
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name;
private CheckBox checkBox;
public MyViewHolder(View view) {
super(view);
name = (TextView) view.findViewById(R.id.textContactName);
checkBox = (CheckBox) view.findViewById(R.id.checkBox);
}
}
public InviteAdapter(Context context, ArrayList<Contact> contactArrayList) {
this.contactArrayList = contactArrayList;
this.mContext = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.invite_contact_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
final Contact contact = contactArrayList.get(position);
holder.name.setText(contact.getmFullName());
holder.checkBox.setChecked(contact.getSelected());
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(b)
{
invite(contact);
Log.e("inviteList",String.valueOf(invitationArrayList.size()));
}
else {
invitationArrayList.remove(contact);
Log.e("inviteList",String.valueOf(invitationArrayList.size()));
}
}
});
}
@Override
public int getItemCount() {
return contactArrayList.size();
}
public void toggleContactsSelection( boolean isSelected ) {
for( Contact contact : contactArrayList ) {
contact.setSelected(isSelected);
invite(contact);
}
notifyDataSetChanged(); // OR you can use notifyItemRangeChanged - which ever suits your needs
}
public void invite(Contact contact)
{
SharedPreferences sharedpreferences = mContext.getSharedPreferences("UserId", Context.MODE_PRIVATE);
String mUserId = sharedpreferences.getString("userId","");
DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm", Locale.ENGLISH);
String date = df.format(Calendar.getInstance().getTime());
Invitation invitation = new Invitation();
invitation.setSender_id(mUserId);
invitation.setDate(date);
invitation.setInvitee_no(contact.getmMobileNo());
invitation.setStatus("0");
invitation.setUser_name(contact.getmUserName());
invitationArrayList.add(invitation);
}
public void removeInvite(int position)
{
invitationArrayList.remove(position);
}
public ArrayList<Invitation> getArrayList(){
return invitationArrayList;
}
}
What is going wrong?
EDIT:
This is an adpater :
public class InviteAdapter extends RecyclerView.Adapter<InviteAdapter.MyViewHolder> {
private ArrayList<Contact> contactArrayList;
private Context mContext;
public ArrayList<Invitation> invitationArrayList = new ArrayList<>();
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name;
private CheckBox checkBox;
public MyViewHolder(View view) {
super(view);
name = (TextView) view.findViewById(R.id.textContactName);
checkBox = (CheckBox) view.findViewById(R.id.checkBox);
}
}
public InviteAdapter(Context context, ArrayList<Contact> contactArrayList) {
this.contactArrayList = contactArrayList;
this.mContext = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.invite_contact_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
final Contact contact = contactArrayList.get(holder.getAdapterPosition());
holder.name.setText(contact.getmFullName());
holder.checkBox.setChecked(contact.getSelected());
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(b)
{
invite(contact);
Log.e("inviteList",String.valueOf(invitationArrayList.size()));
}
else {
contactArrayList.get(position).setSelected(false);
// holder.checkBox.setChecked(false);
// updateInvites();
Log.e("inviteList",String.valueOf(invitationArrayList.size()));
}
}
});
}
@Override
public int getItemCount() {
return contactArrayList.size();
}
public void setChecked()
{
for( Contact contact : contactArrayList ) {
}
}
public void toggleContactsSelection( boolean isSelected ) {
for( Contact contact : contactArrayList ) {
contact.setSelected(isSelected);
invite(contact);
}
notifyDataSetChanged(); // OR you can use notifyItemRangeChanged - which ever suits your needs
}
public void invite(Contact contact)
{
Invitation invitation = new Invitation();
SharedPreferences sharedpreferences = mContext.getSharedPreferences("UserId", Context.MODE_PRIVATE);
String mUserId = sharedpreferences.getString("userId", "");
DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm", Locale.ENGLISH);
String date = df.format(Calendar.getInstance().getTime());
invitation.setSender_id(mUserId);
invitation.setDate(date);
invitation.setInvitee_no(contact.getmMobileNo());
invitation.setStatus("0");
invitation.setUser_name(contact.getmUserName());
invitation.setContact_id(contact.getContactId());
invitationArrayList.add(invitation);
}
public ArrayList<Invitation> getArrayList(){
return invitationArrayList;
}
public void updateInvites(){
invitationArrayList.clear();
for(Contact contact : contactArrayList){
if(contact.getSelected()){
invite(contact);
}
}
}
}
這是活動的代碼:
sendInvites.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mAdapter.updateInvites(); // updating list on sendInvites,
invitationArrayList = mAdapter.getArrayList();
Log.e("inviteList",String.valueOf(invitationArrayList.size()));
Gson gson = new Gson();
String toServer = gson.toJson(
Collections.singletonMap("invitations", invitationArrayList)
);
new SendMultipleInvitesAsyncTask(InviteContactsActivity.this,InviteContactsActivity.this).execute(toServer);
finish();
Intent i = new Intent(InviteContactsActivity.this,InviteContactsActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(i);
}
});
現在,我正在更新onSendInvites的列表,但是當我選中或取消選中api時,它的行為可能不符合預期。
好,所以我說的愚蠢錯誤很少,
一種。 更換
final Contact contact = contactArrayList.get(position);
與
final Contact contact = contactArrayList.get(holder.getAdapterPosition());
b。 您正在添加班級Invitation
對象
Invitation invitation = new Invitation();
invitation.setSender_id(mUserId);
invitation.setDate(date);
invitation.setInvitee_no(contact.getmMobileNo());
invitation.setStatus("0");
invitation.setUser_name(contact.getmUserName());
invitationArrayList.add(invitation);
C。 您正在嘗試刪除類Contacts
對象
else {
invitationArrayList.remove(contact);
Log.e("inviteList",String.valueOf(invitationArrayList.size()));
}
解
在onBindViewHolder中
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
contactArrayList.get(holder.getAdapterPosition()).setSelected(b);
Log.e("inviteList",String.valueOf(invitationArrayList.size()));
}
});
然后做一個像
private void updateInvites(){
invitationArrayList.clear();
for(Contacts contacts : contactsArrayList){
if(contacts.isSelected()){
invite(contact);
}
}
}
這里
contact.setSeletected(boolean status)
和contact.isSelected()
分別是設置方法和獲取方法
編輯: 這是我在RecyclerView上的博客的鏈接,該博客解釋了Simple RecyclerView的大多數概念。
而不是使用對象來刪除使用索引來刪除項目:
invitationArrayList.remove(position);
它會工作。
您的索引超出范圍,因為用戶可能會在添加項目之前將其刪除。 可能是您的InvitationArrayList中不存在的特定元素。 因此,請嘗試以下代碼:
if (invitationArrayList!=null && invitationArrayList.size() > 0 && invitationArrayList.size() > position +1){
invitationArrayList.remove(position);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.