适配器回调

12

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

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

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

}
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是抽象的,无法被实例化。 - Wiillyx3
假设ListAdapter.OnShareClickedListener是第三方库的自定义实现,这种做法是否正确?搜索结果指向codota网站。如果是,有哪些本地替代方案。可能需要参考链接 - r.sumesh
1个回答

21
你需要告诉适配器使用哪个OnShareClickedListener()的实现。目前在你的适配器中,mCallback字段从未被分配,要么你需要在适配器中有一个setOnSharedClickedListener()方法,然后从MainActivity中调用它并将其设置为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.");
    }
}

你的主要活动

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对象。 - Suhas K
我喜欢将回调函数与适配器初始化分离。 - Bhargav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接