private void unbindListItems() {
   final ListView listView = getListView();
   final int count = listView.getChildCount();
   for (int i = 0; i < count; i++) {
     mListAdapter.unbindView(listView.getChildAt(i));
   }
 }
  @Override
  public void onLoadFinished(
      Loader<ArrayList<RecipientsListLoader.Result>> loader,
      ArrayList<RecipientsListLoader.Result> data) {
    // We have an old list, get rid of it before we start again
    if (mListAdapter != null) {
      mListAdapter.notifyDataSetInvalidated();
      unbindListItems();
    }

    // Hide the progress indicator
    mProgressSpinner.setVisibility(View.GONE);

    // Create and set the list adapter
    mListAdapter = new SelectRecipientsListAdapter(this, data, mCheckedPhoneNumbers);

    if (getIntent() != null) {
      String[] initialRecipients = getIntent().getStringArrayExtra(EXTRA_RECIPIENTS);
      if (initialRecipients != null && mMode == MODE_DEFAULT) {
        for (String recipient : initialRecipients) {
          addPhoneNumberToSelectionList(data, recipient);
        }
        invalidateOptionsMenu();
      }
      setIntent(null);
    } else {
      // loader was re-triggered, retain previous selection list
      HashSet<PhoneNumber> selectedNumbers = mCheckedPhoneNumbers;
      mCheckedPhoneNumbers = new HashSet<PhoneNumber>();
      for (PhoneNumber number : selectedNumbers) {
        addPhoneNumberToSelectionList(data, number);
      }
    }

    if (mListAdapter == null) {
      // We have no numbers to show, indicate it
      TextView emptyText = (TextView) getListView().getEmptyView();
      emptyText.setText(mMobileOnly ? R.string.no_recipients_mobile_only : R.string.no_recipients);
    } else {
      setListAdapter(mListAdapter);
      getListView().setRecyclerListener(mListAdapter);
    }
  }
  @Override
  public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) {
    RecipientsListLoader.Result item =
        (RecipientsListLoader.Result) adapter.getItemAtPosition(position);

    if (mMode == MODE_VCARD) {
      flipVCardNumberState(item.phoneNumber);
    } else {
      if (item.group != null) {
        checkGroup(item.group, !item.group.isChecked());
      } else {
        selectPhoneNumber(item.phoneNumber, !item.phoneNumber.isChecked());
        updateGroupCheckStateForNumber(item.phoneNumber, null);
      }
    }

    invalidateOptionsMenu();
    mListAdapter.notifyDataSetChanged();
  }
 @Override
 public void onLoaderReset(Loader<ArrayList<RecipientsListLoader.Result>> data) {
   mListAdapter.notifyDataSetInvalidated();
 }