使用接口将字符串从适配器传递到片段

时间:2019-01-24 10:00:09

标签: java android android-recyclerview onitemclicklistener

这是基于this答案的问题。

我正在尝试将RecyclerView.Adapter中的字符串传递给片段。

在我的适配器中,添加了以下内容:

onItemClickListner onItemClickListner;

public void setOnItemClickListner(VideoAdapter.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner{
    void onClick(String str);//pass your object types.
}

一旦适配器中的项数少于一个(适配器为空),我就传递以下字符串:

onItemClickListner.onClick("TESTING");

然后,在我的片段中添加以下内容:

//I do the following after setting my adapter
videoAdapter.setOnItemClickListner(new VideoAdapter.onItemClickListner() {
        @Override
        public void onClick(String str) {
            Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
        }
    });

由于某种原因,字符串为空/空,并且崩溃指向onItemClickListner.onClick("TESTING");

有人可以看看我可能做错了什么吗?


编辑:

我在onItemClickListner.onClick("TESTING");内部呼叫OnMenuItemClickListener,如下所示:

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {

                case R.id.delete:

                    onItemClickListner.onClick("TESTING");

                return true;

}

我没有提供完整的片段,因为我只是在onCreateView中添加了以上内容。

3 个答案:

答案 0 :(得分:0)

您注意到了吗?来自您的参考文献url

developer

onItemClickListner your_interface; public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) { this.your_interface= onItemClickListner; } 这就是自我分配。这可能是导致问题的原因。

此处this.onItemClickListner = onItemClickListner正在初始化。我怀疑您的your_interface尚未初始化。

因此,请尝试更改名称

答案 1 :(得分:0)

这是我的RecyclerView.Adapter示例的一部分

@Override
    public void onBindViewHolder(ViewHolder holder, final int position) {

        final PopupMenu popupMenu = new PopupMenu(context, holder.itemView);
        popupMenu.inflate(R.menu.simple_menu);
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.item1:
                        if (onEmptyListListener != null) {
                            onEmptyListListener.onEmpty("example string");
                        }
                        return true;
                    default:
                        return false;
                }
            }
        });
        final String name = values.get(position);
        holder.txtHeader.setText(name);
        holder.txtFooter.setText("Footer: " + name);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupMenu.show();
            }
        });
    }

代码的其余部分类似于您的代码,祝酒词显示正确。

答案 2 :(得分:0)

首先,感谢您的所有回答和评论。

我通过以下操作解决了这个问题。


在我的Adapter中,添加了以下内容:

private UpdateInterface listner;

public interface UpdateInterface {
    void recyclerviewOnUpdate(int amount);
}

public VideoAdapter(Context context, ArrayList<PathModel> thumbPathList, ArrayList<PathModel> videoPathList, UpdateInterface listner) {
    this.context = context;
    this.thumbPathList = thumbPathList;
    this.videoPathList = videoPathList;
    //I added this
    this.listner=listner;
}

我以与在问题中相同的方式调用接口:

//Passing the amount of items in adapter
listner.recyclerviewOnUpdate(getItemCount());

这与我之前所做的非常相似,但是现在我在片段中实现了这样的接口:

public class VideoFragment extends Fragment implements VideoAdapter.UpdateInterface

现在我可以使用一种方法,如下所示:

@Override
public void recyclerviewOnUpdate(int amount) {
    //Now I can get the int and check if the adapter is empty after removing a item
    if (amount<1) {
        txtEmptyAdapter.setVisibility(View.VISIBLE);
    }
}