Recently, a question was asked in the communication group: How to respond to ListView internal button clicks in the activity, not in the adapter?
My initial answer to this question was to define a callback interface in adapter to implement the interface in the activity, thus enabling the response to the Click event.
After work to think about it, think there are two ways to achieve better: using the interface callback and the use of abstract class callback.
Just to review the difference between the interface and the abstract class, and then write two demo:
1. Use interface callback:
Adapter class
Package com.ivan.adapter;
Import java.util.List;
Import Android.content.Context;
Import Android.util.Log;
Import Android.view.LayoutInflater;
Import Android.view.View;
Import Android.view.View.OnClickListener;
Import Android.view.ViewGroup;
Import Android.widget.BaseAdapter;
Import Android.widget.Button;
Import Android.widget.TextView;
Import COM.IVAN.LISTVIEWEVENTCALLBACK.R; public class Contentadapter extends Baseadapter implements Onclicklistener {private static final String TAG = "Conte
Ntadapter ";
Private list<string> mcontentlist;
Private Layoutinflater Minflater;
Private Callback Mcallback; /** * Custom Interface for callback button click event to activity * @author Ivan Xu * 2014-11-26/public interface Callback {Publ
IC void Click (View v); Public Contentadapter (context context, list<string> ContentList, Callback Callback) {Mcontentlis
t = ContentList;
Minflater = Layoutinflater.from (context); Mcallback= callback;
@Override public int GetCount () {log.i (TAG, "GetCount");
return Mcontentlist.size ();
@Override public Object getitem (int position) {log.i (TAG, "GetItem");
return Mcontentlist.get (position);
@Override public long getitemid (int position) {log.i (TAG, "Getitemid");
return position;
@Override public View getview (int position, View Convertview, ViewGroup parent) {LOG.I (TAG, "GetView");
Viewholder holder = null;
if (Convertview = = null) {Convertview = minflater.inflate (R.layout.list_item, NULL);
Holder = new Viewholder ();
Holder.textview = (TextView) convertview. Findviewbyid (R.id.textview1);
Holder.button = (Button) Convertview.findviewbyid (R.id.button1);
Convertview.settag (holder);
else {holder = (Viewholder) convertview.gettag ();
} holder.textView.setText (Mcontentlist.get (position)); Holder.buttOn.setonclicklistener (this);
Holder.button.setTag (position);
return convertview;
public class Viewholder {public TextView TextView;
Public button button;
//Response button Click event, call the child definition interface, and pass in view @Override public void OnClick (view v) {Mcallback.click (v);
}
}
Activity class:
Package Com.ivan.listvieweventdemo;
Import java.util.ArrayList;
Import java.util.List;
Import android.app.Activity;
Import Android.os.Bundle;
Import Android.view.Menu;
Import Android.view.View;
Import Android.widget.AdapterView;
Import Android.widget.AdapterView.OnItemClickListener;
Import Android.widget.ListView;
Import Android.widget.Toast;
Import Com.ivan.adapter.ContentAdapter;
Import Com.ivan.adapter.ContentAdapter.Callback;
Import COM.IVAN.LISTVIEWEVENTCALLBACK.R; Mainactivity needs to implement the custom interface public class Mainactivity extends activity implements Onitemclicklistener, Callback {/ /simulate the data loaded in ListView private static final string[] CONTENTS = {"Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Suzhou", "Nanjing", "Wuhan", "Changsha", "hang
State "};
Private list<string> ContentList;
Private ListView Mlistview;
@Override protected void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate);
Setcontentview (R.layout.activity_main);
Init ();
} private void Init () {Mlistview = (ListView) Findviewbyid (R.id.listview);
ContentList = new arraylist<string> ();
for (int i = 0; i < contents.length i++) {contentlist.add (contents[i]);
}//Mlistview.setadapter (new Contentadapter (this, contentlist, this));
Mlistview.setonitemclicklistener (this);
@Override public boolean Oncreateoptionsmenu (Menu menu) {getmenuinflater (). Inflate (R.menu.main, menu);
return true; /** * Response to the Click event of item in ListView/@Override public void Onitemclick (adapterview<?> arg0, View V, T position, long ID) {Toast.maketext (this, "ListView item was clicked!)
, click on the location is--> "+ position, Toast.length_short). Show (); /** * Interface method, Response to ListView button click event/@Override public void Click (View v) {Toast.maketext (Ma Inactivity.this, "ListView's Inside Button was clicked!" , the position is--> "+ (Integer) V.gettag () +", content is--> "+ contentlist.get((Integer) V.gettag ()), Toast.length_short). Show ();
}
}
2. Use abstract class callback
Adapter class:
Package com.ivan.adapter;
Import java.util.List;
Import Android.content.Context;
Import Android.util.Log;
Import Android.view.LayoutInflater;
Import Android.view.View;
Import Android.view.View.OnClickListener;
Import Android.view.ViewGroup;
Import Android.widget.BaseAdapter;
Import Android.widget.Button;
Import Android.widget.TextView;
Import COM.IVAN.LISTVIEWEVENTABSTRACT.R;
public class Contentadapter extends Baseadapter {private static final String TAG = "Contentadapter";
Private list<string> mcontentlist;
Private Layoutinflater Minflater;
Private Myclicklistener Mlistener; Public Contentadapter (context context, list<string> ContentList, Myclicklistener listener) {Mcontentlis
t = ContentList;
Minflater = Layoutinflater.from (context);
Mlistener = listener;
@Override public int GetCount () {log.i (TAG, "GetCount");
return Mcontentlist.size (); @Override public Object GetItem (inT position) {LOG.I (TAG, "GetItem");
return Mcontentlist.get (position);
@Override public long getitemid (int position) {log.i (TAG, "Getitemid");
return position;
@Override public View getview (int position, View Convertview, ViewGroup parent) {LOG.I (TAG, "GetView");
Viewholder holder = null;
if (Convertview = = null) {Convertview = minflater.inflate (R.layout.list_item, NULL);
Holder = new Viewholder ();
Holder.textview = (TextView) convertview. Findviewbyid (R.id.textview1);
Holder.button = (Button) Convertview.findviewbyid (R.id.button1);
Convertview.settag (holder);
else {holder = (Viewholder) convertview.gettag ();
} holder.textView.setText (Mcontentlist.get (position));
Holder.button.setOnClickListener (Mlistener);
Holder.button.setTag (position);
return convertview;
public class Viewholder {public TextView TextView; Public BUtton button; /** * Abstract class for callback * @author Ivan Xu * 2014-11-26/public static abstract class Myclicklistener IM
Plements Onclicklistener {/** * base class OnClick method */@Override public void OnClick (View v) {
Myonclick ((Integer) V.gettag (), v);
public abstract void Myonclick (int position, View v);
}
}
Activity class:
Package Com.ivan.listvieweventdemo;
Import java.util.ArrayList;
Import java.util.List;
Import android.app.Activity;
Import Android.os.Bundle;
Import Android.view.Menu;
Import Android.view.View;
Import Android.widget.AdapterView;
Import Android.widget.AdapterView.OnItemClickListener;
Import Android.widget.ListView;
Import Android.widget.Toast;
Import Com.ivan.adapter.ContentAdapter;
Import Com.ivan.adapter.ContentAdapter.MyClickListener;
Import COM.IVAN.LISTVIEWEVENTABSTRACT.R; public class Mainactivity extends activity implements Onitemclicklistener {//simulation listview Data private static Fin
Al string[] CONTENTS = {"Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Suzhou", "Nanjing", "Wuhan", "Changsha", "Hangzhou"};
Private list<string> ContentList;
Private ListView Mlistview;
@Override protected void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate);
Setcontentview (R.layout.activity_main);
Init (); private void Init () {MLIstview = (ListView) Findviewbyid (R.id.listview);
ContentList = new arraylist<string> ();
for (int i = 0; i < contents.length i++) {contentlist.add (contents[i]);
//Instantiate the Contentadapter class and pass in the implementation class Mlistview.setadapter (this, contentlist, Mlistener);
Mlistview.setonitemclicklistener (this);
@Override public boolean Oncreateoptionsmenu (Menu menu) {getmenuinflater (). Inflate (R.menu.main, menu);
return true;
//Response Item Click event @Override public void Onitemclick (adapterview<?> arg0, View v, int position, long ID) { Toast.maketext (This, "ListView item is clicked!)
, click on the location is--> "+ position, Toast.length_short). Show (); /** * Implementation class, Response button click event/private Myclicklistener Mlistener = new Myclicklistener () {@Override PU Blic void Myonclick (int position, View v) {toast.maketext (Mainactivity.this, "ListView Internal The button is clicked! , the location is--> "+ position + ", content is-->" + contentlist.get (position), Toast.length_short). Show ();
}
};
}
The difference between the two approaches is that when an abstract class is implemented in an activity, it can only be implemented by defining a member variable that cannot be implemented directly by the activity, because Java does not support multiple inheritance. Interfaces can be implemented either directly by the activity or by its member variables.
Original link: http://blog.csdn.net/u011895534/article/details/50439547
The above is the entire content of this article, I hope to help you learn, but also hope that we support the cloud habitat community.