适配器回调
Callback from Adapter
所以我有一个自定义列表视图。这就像 Instagram 布局,每个列表项中有 1 张图像和一堆按钮。所以问题来了:
我想实现分享按钮。为此,我尝试创建一个从适配器到 activity 的回调。但它似乎没有用。这是我到目前为止的内容(我剪掉了不相关的部分):
MainActivity
public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{
ListView main_list;
List<String> 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<String> url_list;
public ListAdapter(Context c, List<String> 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.");
}
}
}
Error Log:
Attempt to invoke interface method 'void com.packagename.ListAdapter$OnShareClickedListener.ShareClicked(java.lang.String)' on a null object reference
您需要告诉适配器要使用 OnShareClickedListener() 的哪个实现。现在在你的适配器中,字段 mCallback 从未分配给,要么你需要在你的适配器中有一个 setOnSharedClickedListener() 方法,然后你从你的 mainActivity 调用它并使用主要 activity 的实现设置它,或者你需要接受构造函数。
我的建议是使用 setter 而不是构造函数。所以你需要做的就是这个。
您的 ListAdapter
public class ListAdapter extends BaseAdapter implements View.OnClickListener {
OnShareClickedListener mCallback;
Context context;
public static List<String> url_list;
public ListAdapter(Context c, List<String> 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<String> 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);
}
}
所以我有一个自定义列表视图。这就像 Instagram 布局,每个列表项中有 1 张图像和一堆按钮。所以问题来了:
我想实现分享按钮。为此,我尝试创建一个从适配器到 activity 的回调。但它似乎没有用。这是我到目前为止的内容(我剪掉了不相关的部分):
MainActivity
public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{
ListView main_list;
List<String> 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<String> url_list;
public ListAdapter(Context c, List<String> 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.");
}
}
}
Error Log:
Attempt to invoke interface method 'void com.packagename.ListAdapter$OnShareClickedListener.ShareClicked(java.lang.String)' on a null object reference
您需要告诉适配器要使用 OnShareClickedListener() 的哪个实现。现在在你的适配器中,字段 mCallback 从未分配给,要么你需要在你的适配器中有一个 setOnSharedClickedListener() 方法,然后你从你的 mainActivity 调用它并使用主要 activity 的实现设置它,或者你需要接受构造函数。
我的建议是使用 setter 而不是构造函数。所以你需要做的就是这个。
您的 ListAdapter
public class ListAdapter extends BaseAdapter implements View.OnClickListener {
OnShareClickedListener mCallback;
Context context;
public static List<String> url_list;
public ListAdapter(Context c, List<String> 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<String> 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);
}
}