从适配器回调

所以我有一个自定义列表视图。 这就像Instagram布局,每个列表项中有1个图像和一堆按钮。 所以这就是问题所在:

我想实现分享按钮。 为此,我尝试创建从适配器到活动的回调。 但它似乎没有用。 这是我到目前为止(我裁掉了不相关的部分):

主要活动

public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{ ListView main_list; List url_list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_list = (ListView) findViewById(R.id.listView); ListAdapter nListAdapter = new ListAdapter(context, url_list); main_list.setAdapter(nListAdapter); } @Override public void ShareClicked(String url) { Log.e("Test",url); } } 

ListAdapter

 public class ListAdapter extends BaseAdapter implements View.OnClickListener { OnShareClickedListener mCallback; Context context; public static List url_list; public ListAdapter(Context c, List list) { this.context = c; url_list = list; } public interface OnShareClickedListener { public void ShareClicked(String url); } @Override public void onClick(View v) { mCallback.ShareClicked("Share this text."); } } } 

错误日志:

 Attempt to invoke interface method 'void com.packagename.ListAdapter$OnShareClickedListener.ShareClicked(java.lang.String)' on a null object reference 

您需要告诉适配器要使用的OnShareClickedListener()实现。 现在在你的适配器中永远不会分配字段mCallback,你需要在你的适配器中有一个setOnSharedClickedListener()方法,然后从mainActivity调用它并使用main活动的实现设置它,或者你需要接受构造函数。

我的建议是使用setter而不是构造函数。 所以你需要做的就是这个。

你的ListAdapter

 public class ListAdapter extends BaseAdapter implements View.OnClickListener { OnShareClickedListener mCallback; Context context; public static List url_list; public ListAdapter(Context c, List list) { this.context = c; url_list = list; } public void setOnShareClickedListener(OnShareClickedListener mCallback) { this.mCallback = mCallback; } public interface OnShareClickedListener { public void ShareClicked(String url); } @Override public void onClick(View v) { mCallback.ShareClicked("Share this text."); } } 

你的MainActivty

 public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{ ListView main_list; List url_list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_list = (ListView) findViewById(R.id.listView); ListAdapter nListAdapter = new ListAdapter(this, url_list); nListAdapter.setOnShareClickedListener(this); main_list.setAdapter(nListAdapter); } @Override public void ShareClicked(String url) { Log.e("Test", url); } }