监听器就是子对象向父对象发送事件发送的通知 并且让父对象做出反应
自定义一个事件监听器主要有四个步骤
-
定义一个接口
在子对象中定义接口(子对象可以是纯粹的Java object 或者Adapter ,fragment,以及其他可以被父对象创建的 例如一个activity )
public class MyCustomObject {
// Step 1 - This interface defines the type of messages I want to communicate to my owner
public interface MyCustomObjectListener {
// These methods are the different events and
// need to pass relevant arguments related to the event triggered
public void onObjectReady(String title);
// or when data has been loaded
public void onDataLoaded(SomeData data);
}}
2.创建一个listener变量以及一个setter方法以便可以调用
public class MyCustomObject {
// ...
// Step 2 - This variable represents the listener passed in by the owning object
// The listener must implement the events interface and passes messages up to the parent.
private MyCustomObjectListener listener;}
public class MyCustomObject {
// Constructor where listener events are ignored
public MyCustomObject() {
// set null or default listener or accept as argument to constructor
this.listener = null;
}
// Assign the listener implementing events interface that will receive the events
public void setCustomObjectListener(MyCustomObjectListener listener) {
this.listener = listener;
}}
3.Implements 接口
public class MyParentActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
// Create the custom object
MyCustomObject object = new MyCustomObject();
// Step 4 - Setup the listener for this object
object.setCustomObjectListener(new MyCustomObjectListener() {
@Override
public void onObjectReady(String title) {
// Code to handle object ready
}
@Override
public void onDataLoaded(SomeData data) {
// Code to handle data loaded from network
// Use the data here!
}
});
}}
4事件触发
(例子中就是数据载入完成)
public class MyCustomObject {
// Listener defined earlier
public interface MyCustomObjectListener {
public void onObjectReady(String title);
public void onDataLoaded(SomeData data);
}
// Member variable was defined earlier
private MyCustomObjectListener listener;
// Constructor where listener events are ignored
public MyCustomObject() {
// set null or default listener or accept as argument to constructor
this.listener = null;
loadDataAsync();
}
// ... setter defined here as shown earlier
public void loadDataAsync() {
AsyncHttpClient client = new AsyncHttpClient();
client.get("https://mycustomapi.com/data/get.json", new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// Networking is finished loading data, data is processed
SomeData data = SomeData.processData(response.get("data"));
// Do some other stuff as needed....
// Now let's trigger the event
if (listener != null)
listener.onDataLoaded(data); // <---- fire listener here
}
});
}}