Can any one tell me how can i obtain the values of the checked rows in a custom view list? For example my code has a custom view list with two text view and a checkbox. Whenever the user checks a row and hits the submit button i need to retrieve the information in the two textview..
The code is
public class contacts extends Activity implements OnItemClickListener {
static final String TAG = "contacts";
ArrayList<String> contactName = new ArrayList<String>();
ArrayList<String> contactNumber = new ArrayList<String>();
MyAdapter myAdapter;
Button AddNumber;
String numberIntent;
View vi;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
getAllContacts(this.getContentResolver());
listView = (ListView) findViewById(R.id.lists);
myAdapter = new MyAdapter();
listView.setAdapter(myAdapter);
listView.setItemsCanFocus(false);
listView.setTextFilterEnabled(true);
// adding
AddNumber = (Button) findViewById(R.id.AddNumbers);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Object listItem = listView.getItemAtPosition(0);
Log.d(TAG,"listView listener" + listItem);
}
});
AddNumber.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
StringBuilder checkedContacts = new StringBuilder();
Log.d(TAG, "onClick" + myAdapter.mCheckStates.size());
for (int i = 0; i < contactName.size(); i++)
{
if (myAdapter.mCheckStates.get(i) == true) {
checkedContacts.append(contactName.get(i).toString());
checkedContacts.append("\n");
} else {
Log.d(TAG, "No OnClick" + contactName.get(i).toString());
}
}
Toast.makeText(contacts.this, checkedContacts,
Toast.LENGTH_LONG).show();
ArrayList<String> checkboxArray = new ArrayList<String>();
myAdapter.mCheckStates = listView.getCheckedItemPositions();
Log.d(TAG, "Sparse" + myAdapter.mCheckStates);
for (int i = 0; i < myAdapter.mCheckStates.size(); i++) {
int position = myAdapter.mCheckStates.keyAt(i);
boolean bool = myAdapter.mCheckStates.valueAt(position);
Log.d(TAG, "Sparse2" + myAdapter.mCheckStates);
}
String[] outputStrArr = new String[checkboxArray.size()];
for (int i = 0; i < checkboxArray.size(); i++) {
outputStrArr[i] = checkboxArray.get(i);
}
}
});
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
myAdapter.toggle(arg2);
}
public void getAllContacts(ContentResolver cr) {
Cursor cursor = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC");
while (cursor.moveToNext()) {
String name = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.d(TAG, "getAllContacts" + phoneNumber);
contactName.add(name);
contactNumber.add(phoneNumber);
}
cursor.close();
Intent in = new Intent(this, TrackLogic.class);
in.putExtra("contact", contactName.toArray());
Log.d(TAG, "Intent????" + contactName);
in.putExtra("contact1", contactNumber.toArray());
}
class MyAdapter extends BaseAdapter implements
CompoundButton.OnCheckedChangeListener {
private SparseBooleanArray mCheckStates;
LayoutInflater mInflater;
TextView phoneView, contactView;
CheckBox checkBox;
MyAdapter() {
mCheckStates = new SparseBooleanArray(contactName.size());
mInflater = (LayoutInflater) contacts.this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return contactName.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
vi = convertView;
if (convertView == null)
vi = mInflater.inflate(R.layout.row, null);
contactView = (TextView) vi.findViewById(R.id.contact_name);
phoneView = (TextView) vi.findViewById(R.id.phone_number);
checkBox = (CheckBox) vi.findViewById(R.id.checkBox_id);
contactView.setText(contactName.get(position));
phoneView.setText(contactNumber.get(position));
checkBox.setTag(position);
checkBox.setChecked(mCheckStates.get(position, false));
checkBox.setOnCheckedChangeListener(this);
return vi;
}
public boolean isChecked(int position) {
return mCheckStates.get(position, false);
}
public void setChecked(int position, boolean isChecked) {
mCheckStates.put(position, isChecked);
Log.d(TAG, "setChecked");
notifyDataSetChanged();
}
public void toggle(int position) {
setChecked(position, !isChecked(position));
}
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
mCheckStates.put((Integer) buttonView.getTag(), isChecked);
}
}
}
I cannot seem to figure it out and its a real drain on me now. Any help is highly appreciated.. Thanks.
update
check this link this is extactly what you want to do
try this in your buttons
onclick
methodin your case you can also do this
try adding listener to your checkbox in your custom adapter see example here
May this help you
Call
isChecked()
on a checkbox to get its status.If you want to count the number of checked Checkboxes then you could store Checkboxes in an
ArrayList
and loop through that...Edit
Inside the
getView()
method, you have to implement aOnCheckedChangeListener
for theCheckBox
.For example:
https://groups.google.com/forum/?fromgroups#!topic/android-developers/No0LrgJ6q2M
Your Custom Adapter must implement
CompoundButton.OnCheckedChangeListener
. Use aSparseBooleanArray
to get the checked items in the list.Then
Then use the checked state to set text to check box
Example :
activity_main.xml
row.xml
You can tick the check box and click the button at the bottom and the checked items are displayed in a toast.
Modify the above according to your requirements.