【问题标题】:Pass String from Adapter to Fragment using interface使用接口将字符串从适配器传递到片段
【发布时间】:2019-01-24 10:00:09
【问题描述】:

此问题基于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();
        }
    });

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

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


编辑:

我在我的OnMenuItemClickListener 中调用onItemClickListner.onClick("TESTING");,如下所示:

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

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

                case R.id.delete:

                    onItemClickListner.onClick("TESTING");

                return true;

}

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

【问题讨论】:

  • 你在什么布局视图上设置了onClickListener?只需显示方法,您在哪里调用onItemClickListner.onClick("TESTING");
  • 是的,请把整个片段代码贴在这里。此外,每当发生崩溃时,获取崩溃日志也会有所帮助。请始终提供尽可能多的背景信息,以便我们为您提供帮助。
  • @grabarz121 请看我的编辑
  • @JoaquimLey 请查看我的编辑,我没有添加整个片段,因为我所做的只是在初始化适配器后在onCreateView 中添加上述内容。
  • 你的popup 初始化了吗?请记住,每个 switch 语句都应该有一个默认情况,在您的代码中应该返回 false

标签: java android android-recyclerview onitemclicklistener


【解决方案1】:

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

onItemClickListner your_interface;

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

this.onItemClickListner = onItemClickListner 这将是自我分配。这可能是导致问题的原因。

这里your_interface 正在初始化。我怀疑你的onItemClickListner 没有初始化。

所以试试改名字

【讨论】:

  • 您能详细说明一下吗?我的一模一样?
  • @HB。已经更新了我的答案。请投票者提供理由
  • 我尝试更改名称,但仍然遇到同样的问题。附言。我没有投反对票。
  • 阅读他所写的内容。他的代码有效,但有一个空字符串。这不是名称问题,如果它会 b - 会有一个编译器错误。
  • @grabarz121 我明白了。但你也可以在评论中提到这一点。否决票并不能证明什么
【解决方案2】:

这是我工作的 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();
            }
        });
    }

其余代码与您的类似,toast 显示正常。

【讨论】:

  • 抱歉,我看不出这与问题有什么关系?就像我说的 - The PopupMenu works perfectly fine as I want it to work。我只复制了我的PopupMenu 的一部分,只是为了演示我在哪里使用onItemClickListner.onClick("TESTING");
  • 我其实已经解决了这个问题,只是没时间回答。
【解决方案3】:

首先,谢谢大家的回答和cmets。

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


在我的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);
    }
}

【讨论】:

  • 所以你从videoAdapter.setOnItemClickListner 改为在片段中实现它。很高兴您解决了您的问题。
猜你喜欢
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多