没有选择联系人到列表视图

时间:2014-11-25 03:21:42

标签: java android

我需要从SelectContactsActivity获取所选联系人,并在ContactListActivity中显示这些选定的联系人。但我没有得到我选择的联系人。

我的SelectContactsActivity.java

public class SelectContactsActivity extends Activity{

private ListView select_listView;
private EditText search_edt;
private List<ContactBean> list = new ArrayList<ContactBean>();
private ContanctAdapter objAdapter;
//private boolean UpdateAB;
private String groupName;

protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_selectcontacts);
select_listView = (ListView) findViewById(R.id.select_contacts_listView);
search_edt = (EditText) findViewById(R.id.inputSearch);
Intent intent = getIntent();
groupName = intent.getStringExtra("group_name");

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,null, null);
while (phones.moveToNext()) {

    String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

    String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

    ContactBean objContact = new ContactBean();
    objContact.setName(name);
    objContact.setPhoneNo(phoneNumber);
    list.add(objContact);
}
phones.close();
objAdapter = new ContanctAdapter(SelectContactsActivity.this, R.layout.select_contacts_list_item, list,  updateAB);
select_listView.setAdapter(objAdapter);
objAdapter.setEditMode(true);

if (null != list && list.size() != 0) {
    Collections.sort(list, new Comparator<ContactBean>() {

        @Override
        public int compare(ContactBean lhs, ContactBean rhs) {
            return lhs.getName().compareTo(rhs.getName());
        }
    });

} else {
    showToast("No Contact Found!!!");
}

select_listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> listview, View v,
            int position, long id) {
        // TODO Auto-generated method stub
        objAdapter.setChecked(position, v);
        objAdapter.notifyDataSetChanged();
        invalidateOptionsMenu();
    }
});

/**
 * Enabling Search Filter
 * */
// Capture Text in EditText
search_edt.addTextChangedListener(new TextWatcher() {

    @Override
    public void afterTextChanged(Editable arg0) {
        // TODO Auto-generated method stub
        String text = search_edt.getText().toString().toLowerCase(Locale.getDefault());
        objAdapter.filter(text);
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1,
            int arg2, int arg3) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2,
            int arg3) {
        // TODO Auto-generated method stub
    }
});
}

private void showToast(String msg) {
// TODO Auto-generated method stub
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}

@Override
protected void onResume() {
super.onResume();
objAdapter.setEditMode(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.actions_select_contacts_list, menu);
  MenuItem item = null;
  if (select_listView.getCount() > 0) {
      if(objAdapter.isCheckItem()){
            menu.findItem(R.id.action_done).setEnabled(true).setVisible(true);
            item = menu.add(Menu.NONE, R.id.action_done, Menu.NONE,R.string.done);
      }else{
          menu.findItem(R.id.action_done).setEnabled(false).setVisible(false);
      }
  }else{
      menu.findItem(R.id.action_done).setEnabled(false).setVisible(false);
  }

  Log.v(this.getClass().getName(), "Check  update..."+objAdapter.isCheckItem());
return true;

}

@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {

    case R.id.action_done:
        StringBuilder _itemBuilder = new StringBuilder();

        objAdapter.saveSelected(groupName);
        invalidateOptionsMenu();

        finish();
        break;

    }
    return true;

}


Handler updateAB = new Handler(){
@Override
public void handleMessage(Message msg) {
    // TODO Auto-generated method stub
    super.handleMessage(msg);
    invalidateOptionsMenu();
    Log.v(SelectContactsActivity.this.getClass().getName(), "Check  invalidate cal;l");
}
};

}

My ContanctAdapter.java

public class ContanctAdapter extends ArrayAdapter<ContactBean> {

public Context mcontext;
private List<ContactBean> items;
private ContactBean objBean;
private boolean isEdit;
private ArrayList<ContactBean> arraylist;
public boolean[] contactCheckArray;
private LayoutInflater inflater;

public ContanctAdapter(Activity act, int row, List<ContactBean> items,  Handler handler) {
super(act, row, items);
this.mcontext = act;
inflater = LayoutInflater.from(act);
this.items = items;
this.arraylist = new ArrayList<ContactBean>();
this.arraylist.addAll(items);
contactCheckArray = new boolean[items.size()];

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final View view = null==convertView?inflater.inflate(R.layout.select_contacts_list_item, null):convertView;

ViewHolder holder = null;
if (null == view.getTag()) {
    holder = new ViewHolder();
    holder.tvname = (TextView) view.findViewById(R.id.tvname);
    holder.tvPhoneNo = (TextView) view.findViewById(R.id.tvphone);
    holder.iv = (ImageView)view.findViewById(R.id.contacts_imageview);
    view.setTag(holder);
} else {
    holder = (ViewHolder) view.getTag();
}

objBean = items.get(position);

if (holder.tvname != null && null != objBean.getName() && objBean.getName().trim().length() > 0) {
    holder.tvname.setText(Html.fromHtml(objBean.getName()));
}
if (holder.tvPhoneNo != null && null != objBean.getPhoneNo()
        && objBean.getPhoneNo().trim().length() > 0) {
    holder.tvPhoneNo.setText(Html.fromHtml(objBean.getPhoneNo()));
}

if (isEdit) {
    holder.iv.setVisibility(View.VISIBLE);
} else {
    holder.iv.setVisibility(View.GONE);
}
return view;
}
public void setEditMode(boolean isEdit) {
this.isEdit = isEdit;
}

public  boolean isCheckItem () {
    for (boolean value : contactCheckArray) {
        if (value)
            return true;
    }
    return false;
}

public void setChecked(final int pos, final View row) {
    if (!contactCheckArray[pos]) {
        ((ViewHolder) row.getTag()).iv.setImageResource(R.drawable.setting_check);
        contactCheckArray[pos] = true;
        notifyDataSetChanged();
    } else {
        contactCheckArray[pos] = false;
        ((ViewHolder) row.getTag()).iv.setImageResource(R.drawable.setting_check_box_bg);
        notifyDataSetChanged();
    }
}

public class ViewHolder {
public ImageView iv;
public TextView tvname, tvPhoneNo;
}

public  void saveSelected(String groupName){
StringBuilder _itemBuilder = new StringBuilder();
ProfilesDatabaseHelper DbHelper = new ProfilesDatabaseHelper(mcontext);
for (int i = 0; i < arraylist.size(); i++) {
    if (contactCheckArray[i]) {
        _itemBuilder.append("'"+ arraylist.get(i).getPhoneNo() + "'" + ",");
        //Toast.makeText(mcontext, "Selected Contacts : "+_itemBuilder.toString(), Toast.LENGTH_LONG).show();
        DbHelper.executeSQL("INSERT INTO GroupsTable (GroupName, ContactName, PhoneNumber) VALUES ('"+groupName+"', '"+arraylist.get(i).getName()+"','"+ arraylist.get(i).getPhoneNo()+ "')");
    }
}
if (_itemBuilder.length() > 0) {
    _itemBuilder.deleteCharAt(_itemBuilder.length() - 1);
    Log.v(getClass().getName(), "Check..selected contactss :"+ _itemBuilder.toString());
    //Toast.makeText(getApplicationContext(), "Selected Contacts : "+_itemBuilder.toString(), Toast.LENGTH_LONG).show();
    // This will clear the buffer
    _itemBuilder.delete(0, _itemBuilder.length());

}
}

public void filter(String charText ) {
// TODO Auto-generated method stub
charText = charText.toLowerCase(Locale.getDefault());
items.clear();
if (charText.length() == 0) {
    items.addAll(arraylist);
}else {
    for (ContactBean ob : arraylist) {
        if (ob.getName().toLowerCase(Locale.getDefault()).contains(charText)) {
            items.add(ob);
        }
    }
}

notifyDataSetChanged();
}
}

如果我自动点击SelectContactsList活动中的第一个项目,我的第9个和第17个,第25个,第33个....联系人也被选中并返回一个联系人,我没有选择联系人列表活动。我没有收到任何错误。任何人都帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您的问题是在收听者的第一个片段中使用此行。

objAdapter.setChecked(position, v);

POSITION与ID不同。 ListView仅呈现需要显示的项目数。该位置是呈现列表中的位置。

将其更改为id

请参阅此文章,以便通过深入的示例更好地解释此问题:Create a ListView with selectable rows/change background color of ListView rows when clicked