0

我已将 Activity 中的自定义 BaseAdapter 设置为:

llNoContactMessage = (LinearLayout) findViewById(R.id.llNoContacts);
    listAdapter = new ContactsListAdapter(this, contactsList);
    lvContactList = (ListView) findViewById(R.id.lvContactList);
    lvContactList.setAdapter(listAdapter);
    lvContactList.setOnItemClickListener(null);

还有我的适配器类:

public class ContactsListAdapter extends BaseAdapter {

private List<ContactsInfo> contactList;
private Context context;

public ContactsListAdapter(Context context, List<ContactsInfo> contactsList) {
    this.context = context;
    this.contactList = contactsList;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    final ContactsInfo contactsInfo = contactList.get(position);

    if(view == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.activity_contacts_item, parent, false);

        ViewHolder vh = new ViewHolder();
        vh.tvContactName = (TextView) view.findViewById(R.id.tvContactName);
        vh.tvContactNumber = (TextView) view.findViewById(R.id.tvContactNumber);
        vh.llRemoveContact = (LinearLayout) view.findViewById(R.id.llRemoveContact);

        view.setTag(vh);
    }

    final ViewHolder holder = (ViewHolder) view.getTag();
    holder.tvContactName.setText(contactsInfo.getContactName());
    holder.tvContactNumber.setText(contactsInfo.getContactNumber());
    holder.llRemoveContact.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            UIUtils.showRemoveContactAlert(context, contactsInfo);
            if(UIUtils.contactRemoved) {
                contactList.remove(contactsInfo);
                setList(getContacts());
                notifyDataSetChanged();
            }
        }
    });

    return view;
}

static class ViewHolder {
    TextView tvContactNumber;
    TextView tvContactName;
    LinearLayout llRemoveContact;
}

@Override
public int getCount() {
    return contactList.size();
}

@Override
public ContactsInfo getItem(int index) {
    return contactList.get(index);
}

@Override
public long getItemId(int position) {
    return getItem(position).get_id();
}

public void setList(List<ContactsInfo> list) {
    contactList.clear();
    contactList.addAll(list);
}

private List<ContactsInfo> getContacts() {
    CrisisCallingDatabase crisisCallDB = new CrisisCallingDatabase(context);

    return crisisCallDB.getContactsList();
}

}

从数据库中删除数据的方法是:

public static void showRemoveContactAlert(final Context context, final ContactsInfo contact) {
    AlertDialog.Builder b = new AlertDialog.Builder(context);
    b.setMessage("Remove Contact");
    b.setCancelable(true);
    b.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            CrisisCallingDatabase ccd = new CrisisCallingDatabase(context);
            if(ccd.deletContact(contact.get_id())){
                Toast.makeText(context, contact.getContactName() + " removed successfully.", Toast.LENGTH_SHORT).show();
                contactRemoved = true;
            } else {
                Toast.makeText(context, "Remove contact failed.", Toast.LENGTH_SHORT).show();
                contactRemoved = false;
            }
            CrisisCallingDatabase.closeDBConnections();
        }
    });
    b.setNegativeButton("No", null);
    b.show();
}

但是列表的视图不会从列表中删除该项目。但是,再次单击列表上的任何 UI 组件后,将重新加载列表,即删除的项目被删除。我不知道我在哪里做错了。任何帮助将不胜感激。

4

3 回答 3

2

notifyDataSetChanged()调用移到setList方法的末尾。

于 2013-10-16T17:10:04.563 回答
1

终于解决了这个问题,我只是在 On Click 事件中移动了确认警报代码,如下所示:

holder.llRemoveContact.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            context.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    AlertDialog.Builder b = new AlertDialog.Builder(context);
                    b.setMessage("Remove Contact");
                    b.setCancelable(true);
                    b.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            if(succefulRemoval)){
                                contactList.remove(contactsInfo);
                                setList();
                                Toast.makeText(context, contactsInfo.getContactName() + " removed successfully.", Toast.LENGTH_SHORT).show();
                            } else {
                                Toast.makeText(context, "Remove contact failed.", Toast.LENGTH_SHORT).show();
                            }

                        }
                    });
                    b.setNegativeButton("No", null);
                    b.show();
                }
            });

        }
    });
于 2013-10-17T16:31:17.700 回答
0

也许你已经得到了答案,但只是为了额外

public void setList(List<ContactsInfo> list) {
contactList.clear();
contactList.addAll(list);
contactList.notifyDataSetChanged();
}
于 2013-10-16T19:11:38.740 回答