从适配器回调
所以我有一个自定义列表视图。 这就像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); } }