0

アクティビティのカスタム BaseAdapter を次のように設定しました。

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

そして、私の Adapter クラスがあります:

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

0

すでに回答を得ているかもしれませんが、補足として

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