【问题标题】:Callback from Adapter来自适配器的回调
【发布时间】:2015-11-09 01:26:06
【问题描述】:

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

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

主活动

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

}

列表适配器

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

}

错误日志:

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

【问题讨论】:

  • 不能。给出错误:OnShareClickedListener 是抽象的。无法实例化。
  • 假设 ListAdapter.OnShareClickedListener 是第三方库的自定义实现是否正确?搜索将我带到codota 网站。如果是,什么是原生替代品。可能关注link

标签: java android callback adapter


【解决方案1】:

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

我的建议是使用 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.");
    }
}

你的 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(this, url_list);
        nListAdapter.setOnShareClickedListener(this);
        main_list.setAdapter(nListAdapter);
    }

    @Override
    public void ShareClicked(String url) {
        Log.e("Test", url);
    }

}

【讨论】:

  • 您必须在您的活动中实例化 OnShareClickedListener 并将该实例传递给您的列表适配器的构造函数。使用传递的 OnShareClickedListener 实例分配 mCallback。您的代码的问题是您没有初始化 Listener 对象。
  • 我喜欢从适配器初始化中解耦回调
猜你喜欢
  • 2022-11-18
  • 2017-10-22
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多