java - 适配器回调

标签 java android callback adapter

所以我有一个自定义 ListView 。这就像 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.");
    }
}

你的主要 Activity

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);
    }

}

关于java - 适配器回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32032933/

相关文章:

java - 变更传播规则和影响分析

android - 在 Twitter 上允许该应用程序后未找到 Oauth 回调

android - 关于在 Android 应用程序中动态检查权限

javascript - 在 react : the react way 中将函数传递给 child

javascript - Vuejs 上的回调函数

java - Android Activity list 错误

java - Cloudfoundry 中的 Spring 应用程序无法读取云属性

java - 数组排序有效

android - 允许 ListView 内的 AdMob 原生广告吗?

ios - 在 UITabBarController 中回调