[英]Pass String from Adapter to Fragment using interface
这个问题是基于这个答案。
我试图将一个字符串从我的RecyclerView.Adapter
传递给我的片段。
在我的适配器中,我添加了以下内容:
onItemClickListner onItemClickListner;
public void setOnItemClickListner(VideoAdapter.onItemClickListner onItemClickListner) {
this.onItemClickListner = onItemClickListner;
}
public interface onItemClickListner{
void onClick(String str);//pass your object types.
}
一旦我的适配器中的项目数量少于 1(适配器为空),我就会传递以下字符串:
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
添加了上述内容。
你注意到这一点了吗? 从您的参考网址
onItemClickListner your_interface;
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
this.your_interface= onItemClickListner;
}
this.onItemClickListner = onItemClickListner
这将是自我分配。 这可能是导致问题的原因。
这里your_interface
正在初始化。 我怀疑您的onItemClickListner
未初始化。
所以尝试通过更改名称
这是我工作 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();
}
});
}
其余代码与您的相似,吐司显示正确。
首先,感谢大家的回答和评论。
我通过执行以下操作解决了这个问题。
在我的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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.