3. Interact with the adapter using activity and delegate
This is what you see in the book, which helps developers move all of their business logic from the adapter to the activity through the commit mode.
Here is an example of adding a phone number, each row in the list has a RemoveButton, which removes the phone number and implements the Click processor of the "Remove" button in the adapter, but. The method of deleting objects is not implemented in the adapter, and we use a delegate interface to invoke the activity method to delete the object.
The code for the adapter:
public class Numbersadapter extends Arrayadapter<integer> {
public static interface Numbersadapterdelegate {//define entrusted interface
void RemoveItem (Integer value);
}
Private Layoutinflater Minflator;
Private Numbersadapterdelegate mdelegate;
Public Numbersadapter (context context, list<integer> objects) {
Super (context, 0, objects);
Minflator = Layoutinflater.from (context);
}
@Override
Public View GetView (int position, View CV, viewgroup parent) {
if (null = = CV) {
CV = Minflator.inflate (R.layout.number_row, parent, false);
}
Final Integer value = GetItem (position);
TextView TV = (TextView) Cv.findviewbyid (R.id.numbers_row_text);
Tv.settext (Value.tostring ());
View button = Cv.findviewbyid (R.id.numbers_row_button);
Button.setonclicklistener (New Onclicklistener () {
@Override
public void OnClick (View v) {
if (null! = Mdelegate) {
Mdelegate.removeitem (value); Delete Object
}
}
});
return CV;
}
public void Setdelegate (Numbersadapterdelegate delegate) {//Set the entrusted object for the adapter
Mdelegate = delegate;
}
}
Activity's Code:
public class Mainactivity extends Activity implements
Numbersadapter.numbersadapterdelegate {//Implement Numbersadapterdelegate interface
private static final String TAG = Mainactivity.class
. Getcanonicalname ();
Private ListView Mlistview;
Private arraylist<integer> mnumbers;
Private Numbersadapter Madapter;
Private EditText Medittext;
@Override
public void OnCreate (Bundle savedinstancestate) {
Super.oncreate (savedinstancestate);
Setcontentview (R.layout.main);
Medittext = (EditText) Findviewbyid (R.id.main_edittext);
Mlistview = (ListView) Findviewbyid (R.id.main_listview);
Mnumbers = new arraylist<integer> ();
Madapter = new Numbersadapter (this, mnumbers);
Mlistview.setadapter (Madapter);
}
@Override
protected void Onresume () {
Super.onresume ();
Madapter.setdelegate (this); Register the entrusted object in the Onresume method
}
@Override
protected void OnPause () {
Super.onpause ();
Madapter.setdelegate (NULL); Cancellation of the consignment object in the OnPause method
}
@Override
public void RemoveItem (Integer value) {//Removes the specified item from the list, and then notifies the adapter that the data of the binding has changed
Mnumbers.remove (value);
Toast
. Maketext (This, "removed object:" + value, Toast.length_short)
. Show ();
Madapter.notifydatasetchanged ();
}
public void Addnumber (View v) {
String value = Medittext.gettext (). toString (). Trim ();
try {
Mnumbers.add (integer.valueof (value));
Medittext.settext ("");
Madapter.notifydatasetchanged ();
} catch (NumberFormatException e) {
LOG.E (TAG, "couldn ' t convert to integer the string:" + value);
}
}
}
The entrusted object is not set in the OnCreate method, but the entrusted object is set in the Onresume method. The goal is to ensure that only when the activity is displayed on the screen will it be used as a trusted object.
ListView Optimization Summary (ii)--android